VBA Создание листов, обработка ошибок. Создать лист vba excel


VBA Создание листов, обработка ошибок

Я использую приведенный ниже код, чтобы скопировать скрытый рабочий лист и скопировать его, переименовать и заполнить определенные поля на двух листах.

Я сделал это так, так как мне нужно скопировать макет и форматирование скрытого листа.

Проблема, с которой я столкнулся, заключается в том, что когда я нажимаю кнопку «Создать», если лист уже выходит, он полностью сбой Excel, я попытался добавить обработку ошибок, но все, что я пытался проверить, существует ли лист, t работает и по-прежнему выдает Excel.

Отделили код, который не скрывает лист шаблона, копирует его, переименовывает новый лист и затем скрывает шаблон.

Что бы я хотел сделать, это проверить введенное имя листа из TextBox5, и проверить, существует ли лист, если он отображает окно с сообщением, если лист уже существует, если лист не существует, они несут с кодом как обычно.

Если вы действительно цените всю помощь и поддержку, которые я уже получил, и благодарим всех вас за помощь, которую вы можете предоставить.

Private Sub CommandButton3_Click() Dim wb As Workbook: Set wb = ThisWorkbook Dim ws As Worksheet: Set ws = wb.Sheets("Template") Dim newws As Worksheet, sh As Worksheet, newname Dim query As Long, xst As Boolean, info As String Dim NextRow As Long, myCCName As Variant, lastRow2 As Long, lastRow As Long 'Contract Name Dim Contact As String, name As String, name2 As String, SpacePos As Integer Dim answer As Integer With Application .ScreenUpdating = False .EnableEvents = False .CutCopyMode = False End With lastRow2 = Sheets("Payment Form").Range("A18:A34").End(xlDown).Row lastRow = Sheets("Payment Form").Range("U36:U53").End(xlDown).Row 'Contract Name Set contract = Sheets("Payment Form").Range("C9") SpacePos = InStr(contract, "- ") name = Left(contract, SpacePos) name2 = Right(contract, Len(contract) - Len(name)) ' retry: xst = False newname = Me.TextBox5.Value myCCName = Me.TextBox4.Value If newname = "" Then MsgBox "You have not entered a CC Code Number. Please enter CC Code Number!", vbExclamation, "An Error Occured" Exit Sub End If If myCCName = "" Then MsgBox "You have not entered a CC Code Name. Please enter CC Code Name!", vbExclamation, "An Error Occured" Exit Sub End If For Each sh In wb.Sheets If sh.name = newname Then xst = True: Exit For End If Next If Len(newname) = 0 Or xst = True Then info = "Sheet name is invalid. Please retry." GoTo retry End If Sheets("Template").Visible = True ws.Copy before:=Sheets("Details"): Set newws = ActiveSheet: newws.name = newname Sheets("Template").Visible = False With ActiveWorkbook.Sheets("Payment Form").Activate For Each cell In Columns(1).Range("A18:A34").Cells If Len(cell) = 0 Then cell.Select: Exit For Next cell ActiveCell.Value = newname & " " & "-" & name2 & ":" & " " & myCCName End With With ActiveWorkbook.Sheets(newname).Activate ActiveWorkbook.Sheets(newname).Range("D4") = Sheets("Payment Form").Range("a18:a34").End(xlDown).Value ActiveWorkbook.Sheets(newname).Range("D6") = Sheets("Payment Form").Range("L11").Value ActiveWorkbook.Sheets(newname).Range("D8") = Sheets("Payment Form").Range("C9").Value ActiveWorkbook.Sheets(newname).Range("D10") = Sheets("Payment Form").Range("C11").Value End With ActiveWorkbook.Sheets("Payment Form").Activate With ActiveWorkbook.Sheets("Payment Form") Range("J" & lastRow2 + 1) = 0 Range("L" & lastRow2 + 1).Formula = "=N" & lastRow2 + 1 & "-J" & lastRow2 + 1 & "" Range("N" & lastRow2 + 1).Formula = "='" & newname & "'!L20" Range("U" & lastRow + 1) = newname & ":" & " " Range("V" & lastRow + 1).Formula = "='" & newname & "'!I21" Range("W" & lastRow + 1).Formula = "='" & newname & "'!L23" Range("X" & lastRow + 1).Formula = "='" & newname & "'!K21" End With answer = MsgBox("Would you like to create another sheet?", vbYesNo + vbQuestion, "New Sheet") If answer = vbYes Then Else Unload Me End If With Application .ScreenUpdating = True .EnableEvents = True .CutCopyMode = True End With Me.TextBox4.Value = "" Me.TextBox5.Value = "" End Sub

stackoverrun.com

vba - создать макрос, который преобразует строки excel из одного листа в новые листы

Мне нужно создать макрос, который преобразует строки excel из одного листа в новые листы.

У меня есть 3 строки заголовков, за которыми следуют множество строк данных.

Я хотел бы поместить каждую строку на этом листе "Dept" в новые листы (за исключением строк заголовка). На каждом новом созданном листе я хотел бы, чтобы верхние 3 строки (заголовки) повторялись и форматировали скопированные (если возможно), а затем одну соответствующую строку из листа "Департамент". Мне также хотелось бы, чтобы новые листы назывались значением, введенным в колонке А (например, потолочные огни или настенные светильники из приведенного ниже примера).

У меня нет опыта работы с макросами, поэтому у меня возникают проблемы с получением кода из предыдущих ответов и попыткой применить его к моей причине. Спасибо за помощь!

A B C D
  1. шаблон шаблона//promos//quicklinks//главный баннер

  2. где найдено //content slot//category//attributes

  3. blank//контент-ресурс//html//изображение героя

  4. Потолочные светильники//значение//значение//значение

  5. Настенные светильники//значение//значение//значение

  6. Floor Lights//value//value//value

Преобразован на новые листы в одной книге, которые имеют одну строку после трех строк заголовка:

новый лист с именем: потолочные светильники

A B C D
  1. шаблон шаблона//promos//quicklinks//главный баннер

  2. где найдено //content slot//category//attributes

  3. blank//контент-ресурс//html//изображение героя

  4. Потолочные светильники//значение//значение//значение

новый лист с именем: Wall Lights

A B C D
  1. шаблон шаблона//promos//quicklinks//главный баннер

  2. где найдено //content slot//category//attributes

  3. blank//контент-ресурс//html//изображение героя

  4. Настенные светильники//значение//значение//значение

Вот код, который у меня есть до сих пор...

Sub Addsheets() Dim cell As Range Dim b As String Dim e As String Dim s As Integer Sheets("Dept").Select a = "a4" e = Range(a).End(xlDown).Address 'get address of the last used cell 'loops through cells,creating new sheets and renaming them based on the cell value For Each cell In Range(a, e) s = Sheets.Count Sheets.Add After:=Sheets(s) Sheets(s + 1).Name = cell.Value Next cell Application.CutCopyMode = True Dim Counter As Long, i As Long Counter = Sheets.Count For i = 1 To Counter Sheets("Dept").Cells(1, 3).EntireRow.Copy Sheets(i).Cells(1, 3).PasteSpecial Next i Application.CutCopyMode = False End Sub

Я могу получить новые листы для создания и имени на основе ячеек в столбце A с верхней частью кода, но когда я попытался добавить код, чтобы первые три строки (строки заголовков) копировались на каждый из этих вновь созданных листов, я get Error 9 Subscript вне диапазона для: Листы (i). Целлы (1, 3).PasteSpecial.

Не знаете, как исправить? Кроме того, существует ли способ сохранить форматирование заголовка (ширины столбцов)?

qaru.site

vba - Excel Macro для создания листов

Вместо этого я рекомендовал бы использовать сводную таблицу, в зависимости от того, чего вы пытаетесь достичь. Если вам нужно сделать вышеописанное, я попытаюсь выполнить следующие шаги, я оставлю вам код, Я привел несколько функций ниже, чтобы помочь.

  • Выберите все использованные ячейки в в качестве диапазона.
  • Прокрутите диапазон и для каждой ячейки проверьте, существует ли лист с именем, соответствующим значению ячейки.
  • Если лист не существует, вы можете его создать, а затем использовать ссылочный стиль R1C1, чтобы получить значение из столбца B и вставить это во вновь созданный лист. Готовьте, что вновь созданный лист становится активным листом.
  • Если лист существует, вы можете выбрать рабочий лист и сделать то же, что и в 3, убедившись, что вы вставляете его в следующую доступную ячейку ниже любого уже сделанного.

Я рекомендую использовать макросъемку для разработки способа копирования и вставки и т.д.

Вот пример добавления и удаления рабочей страницы:

Dim sheetname 'not tested this, something similar to get the value, obviously you will need to loop through checking this sheet name sheetname = Range("A:A").Cells(1,1).Value If SheetExists(sheetname, ThisWorkbook.Name) Then 'turn off alert to user before auto deleting a sheet so the function is not interrupted Application.DisplayAlerts = False ThisWorkbook.Worksheets(sheetname).Delete Application.DisplayAlerts = True End If 'Activating ThisWorkbook in case it is not ThisWorkbook.Activate Application.Sheets.Add 'added sheet becomes the active sheet, give the new sheet a name ActiveSheet.Name = sheetname

Вот функция sheetexists, которая также использует функцию WorkbookIsOpen, показанную ниже. Это можно использовать, чтобы помочь вам увидеть, существует ли лист, который вы хотите создать, или нет.

Function SheetExists(sname, Optional wbName As Variant) As Boolean ' check a worksheet exists in the active workbook ' or in a passed in optional workbook Dim X As Object On Error Resume Next If IsMissing(wbName) Then Set X = ActiveWorkbook.Sheets(sname) ElseIf WorkbookIsOpen(wbName) Then Set X = Workbooks(wbName).Sheets(sname) Else SheetExists = False Exit Function End If If Err = 0 Then SheetExists = True _ Else SheetExists = False End Function Function WorkbookIsOpen(wbName) As Boolean ' check to see if a workbook is actually open Dim X As Workbook On Error Resume Next Set X = Workbooks(wbName) If Err = 0 Then WorkbookIsOpen = True _ Else WorkbookIsOpen = False End Function

Я бы рекомендовал присвоить значения в диапазоне A имя так, чтобы вы могли более легко перебирать их, чтобы вы могли делать такие вещи:

For Each Cell In Range("ListOfNames") ... Next

Если вы не можете этого сделать, вам понадобится функция для проверки столбца A для используемого диапазона. как этот:

Function GetUsedRange(wbName As String, Optional wsName As Variant, Optional argFirstRow As Variant, Optional argLastCol As Variant) As Range 'this function uses the find method rather than the usedrange property because it is more reliable 'I have also added optional params for getting a more specific range Dim lastRow As Long Dim firstRow As Long Dim lastCol As Integer Dim firstCol As Integer Dim ws As Worksheet If Not IsMissing(wsName) Then If SheetExists(wsName, wbName) Then Set ws = Workbooks(wbName).Worksheets(wsName) Else Set ws = Workbooks(wbName).ActiveSheet End If Else Set ws = Workbooks(wbName).ActiveSheet End If If IsMissing(argFirstRow) Then ' Find the FIRST real row firstRow = ws.Cells.Find(What:="*", SearchDirection:=xlNext, SearchOrder:=xlByRows).Row Else firstRow = argFirstRow End If ' Find the FIRST real column firstCol = ws.Cells.Find(What:="*", SearchDirection:=xlNext, SearchOrder:=xlByColumns).Column ' Find the LAST real row lastRow = ws.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row If IsMissing(argLastCol) Then ' Find the LAST real column lastCol = ws.Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Column Else lastCol = argLastCol End If 'return the ACTUAL Used Range as identified by the variables above Set GetUsedRange = ws.Range(ws.Cells(firstRow, firstCol), ws.Cells(lastRow, lastCol)) End Function

qaru.site