Excel VBA Создание/перезапись новой книги и использование кнопки отмены. Excel vba создать новую книгу


Создание макроса VBA, который создает новую консолидированную рабочую книгу из столбцов другого набора данных excel

Активация и выбор являются распространенными проблемами в коде. Вот отличная рекомендация о том, как избежать их использования.

Вот пример того, как добавить новую книгу и установить ее в переменную, чтобы вы могли легко получить ссылку на нее позже в коде:

Sub CreateWBandCopy() ' Link variable to source workbook Dim wbSource As Workbook Set wbSource = Workbooks("book1") ' Copy Column L from source book wbSource.Sheets(1).Range("L:L").Copy ' Create new workbook and assign to variable Dim wb As Workbook Set wb = Workbooks.Add ' Link sheet1 to variable -can also use name like this: Sheets("Sheet1") Dim ws As Worksheet Set ws = wb.Sheets(1) ' Link Specific range to variable Dim rng As Range Set rng = ws.Columns("A:A") ' Paste source col L to new book col A rng.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False End Sub

Обратите внимание, что код легко отслеживает, что делается. Вам не нужно отслеживать, какая книга или лист или ячейка активны в данный момент.

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

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

Sub Compfinder() ' ' Compfinder Macro ' ActiveWindow.ScrollColumn = 2 ActiveWindow.ScrollColumn = 3 ActiveWindow.ScrollColumn = 4 ActiveWindow.ScrollColumn = 5 ActiveWindow.ScrollColumn = 6 ActiveWindow.ScrollColumn = 7 ActiveWindow.ScrollColumn = 8 ActiveWindow.ScrollColumn = 9 ActiveWindow.ScrollColumn = 10 Dim wbSource As Workbook Set wbSource = ActiveWorkbook Dim wsSource As Worksheet Set wsSource = wbSource.ActiveSheet Dim rngQ As Range Set rngQ = wsSource.Columns("Q:Q") rngQ.Copy ''''''''''''''''''''''''' Dim wbNew As Workbook Set wbNew = Workbooks.Add Dim wsNew As Worksheet Set wsNew = wbNew.Sheets(1) Dim rng As Range Set rng = wsNew.Columns("A:A") rng.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ''''''''''''''''''''''''' Application.CutCopyMode = False wsNew.Range("A1").FormulaR1C1 = "Geo Location" wsSource.Columns("K:K").Copy wsNew.Columns("B:B").PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False wsSource.Columns("L:L").Copy wsNew.Columns("C:C").PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone, SkipBlanks:=False, Transpose:=False wbNew.Activate ActiveWorkbook.SaveAs Filename:="C:\Users\raysharm\Documents\Compfinder columns.csv", FileFormat:=xlCSV, CreateBackup:=False End Sub

За исключением последнего сохранения (на ваш путь), я тестировал, что код работает без ошибок.

excel.bilee.com

Кнопка VBA создает новые листы для новой книги MS Excel онлайн

вы можете настроить свой код следующим образом:

Set newWB = GetOrCreateWB("NewWb", "C:\Users\....\MyFolder") '<--| try getting the already open "NewWb" workbook or opening it from given folder ore create it in given folder thisWB.Sheets("TEMPLATE").Copy after:=newWB.Sheets(1) With ActiveSheet '<--| the just pasted worksheet becomes the active one .Name = AddEmployeeUF.txtFirstname.Text + AddEmployeeUF.txtMiddleinitial.Text + AddEmployeeUF.txtLastname.Text + "Template" '<--| Name it ws.Hyperlinks.Add Anchor:=ws.Range("F" & LastRow), Address:="", SubAddress:=.Name & "!A1", TextToDisplay:="View" '<--| hyperlink to new sheet End With Next i

который использует следующие функции:

Function GetOrCreateWB(wbName As String, wbPath As String) As Workbook On Error Resume Next Set GetOrCreateWB = Workbooks(wbName) If GetOrCreateWB Is Nothing Then Set GetOrCreateWB = Workbooks.Open(wbPath & "\" & wbName) If GetOrCreateWB Is Nothing Then Set GetOrCreateWB = Workbooks.Add GetOrCreateWB.SaveAs Filename:=wbPath & "\" & wbName End If End If End Function

В обычном модуле кода (не в модуле кода UserForm) выполните это вне любой процедуры, расположенной в верхней части модуля :

Public newWB as Workbook

Затем, ваш код пользовательской формы, как это (вам нужно будет изменить с помощью вашего дополнительного кода, так как у меня нет вашей структуры и доступных данных):

Private Sub btnSave_Click() Dim sh As Worksheet Dim thisWB As Workbook Set thisWB = ThisWorkbook If Module1.newWB Is Nothing Then Set Module1.newWB = Workbooks.Add End If thisWB.Sheets("TEMPLATE").Copy after:=newWB.Sheets(newWB.Sheets.Count) Set sh = Module1.newWB.Sheets("TEMPLATE") ' Naming and hyperlink to new sheet 'sh.Name = AddEmployeeUF.txtFirstname.Text + AddEmployeeUF.txtMiddleinitial.Text + AddEmployeeUF.txtLastname.Text + "Template" 'This line raises an error because "ws" is not declared 'ws.Hyperlinks.Add Anchor:=ws.Range("F" & LastRow), Address:="", SubAddress:=sh.Name & "!A1", TextToDisplay:="View" End Sub

При первом запуске этого кода Module1.newWB ничего, ему не назначено какое-либо значение объекта. Таким образом, новая рабочая книга создается с использованием метода Workbooks.Add , назначенного переменной Module1.newWB , и эта переменная сохраняется до тех пор, пока вы не закроете файл или не потеряете состояние в среде выполнения VBA (т. Е. Необработанное исключение, которое вы прерывание или завершение времени выполнения и т. д.).

excel.bilee.com

vba - Excel 2013 VBA Создание кнопок для новой рабочей книги

Долгое время, первый постер!

Я работаю на шезлонге Campus Food Shelf, и я недавно очень активно участвовал в рационализации их отчетности и ввода данных. Задача, которую я сейчас выполняю, заключается в создании программы, которая создала единый лист 1, так что программы отчетности, которые я создал до сих пор, могут быть легко экспортированы в новые книги, вскоре после окончания учебы. Я знаком (но отнюдь не экспертом) с C/C++, Python и совсем недавно VBA.

Я запускаю ошибку при создании кнопок для Листа 1. Ошибка: "Идентификатор под курсором не распознается". Результат, который я ищу с помощью этого кода, состоит в том, чтобы создать 5 отдельных кнопок, связанных с 5 отдельными Sub-программами, которые уже определены. Я хотел бы разместить их в определенных местах с определенными размерами. Этот код:

Sub DONOTUSEbuttonMaker() Dim Report1, Report2, Report3, Unique, NewWork As Object Dim Targeter As Range Dim i As Integer For i = 1 To 5 Select Case i: Case 1: Set Targeter = Worksheets(1).Range(Cells(3, 7), Cells(3, 7)) Set Report1 = Worksheets(1).Buttons.Add(Targeter.Left, Targeter.Top, Width:=2, Height:=0.33) With Report1 .OnAction = "WeeklyReportsP1" .Caption = "Weekly Reports P1" .Name = "Weekly Reports P1" End With Case 2: Set Targeter = Worksheets(1).Range(Cells(5, 7), Cells(5, 7)) Set Report1 = Worksheets(1).Buttons.Add(Targeter.Left, Targeter.Top, Width:=2, Height:=0.33) With Report2 .OnAction = "WeeklyReportsP2" .Caption = "Weekly Reports P2" .Name = "Weekly Reports P2" End With Case 3: Set Targeter = Worksheets(1).Range(Cells(7, 7), Cells(7, 7)) Set Report1 = Worksheets(1).Buttons.Add(Targeter.Left, Targeter.Top, Width:=2, Height:=0.33) With Report3 .OnAction = "WeeklyReportsP3" .Caption = "Weekly Reports P3" .Name = "Weekly Reports P3" End With Case 4: Set Targeter = Worksheets(1).Range(Cells(9, 7), Cells(9, 7)) Set Report1 = Worksheets(1).Buttons.Add(Targeter.Left, Targeter.Top, Width:=2, Height:=0.33) With Unique .OnAction = "CalculateUnique" .Caption = "Calculate Unique" .Name = "Calculate Unique" End With Case 5: Set Targeter = Worksheets(1).Range(Cells(11, 7), Cells(11, 7)) Set Report1 = Worksheets(1).Buttons.Add(Targeter.Left, Targeter.Top, Width:=2, Height:=0.33) With NewWork .OnAction = "NewWeekWorkSheet" .Caption = "Create New Worksheet" .Name = "Create New Worksheet" End With End Select Next i End Sub

Ошибка возникает в случае 2 в строке с.OnAction. Который также кажется странным для меня, потому что он не бросает ошибку в случае 1... Любая помощь будет принята с благодарностью!

qaru.site

vba - Excel VBA Создание/перезапись новой книги и использование кнопки отмены

У меня есть макрос, написанный с диапазоном из одной книги и копией в новую рабочую книгу, которая затем сохраняет недавно созданную книгу (и дает ей имя) в тот же путь к папке. Когда эта рабочая книга уже существует (переписывая книгу), появляется диалоговое окно по умолчанию Windows, спрашивающее, хотите ли вы перезаписать, с отменой выбора кнопок "да". Когда кнопка отмены нажата, создается новая книга. Как отредактировать этот код, чтобы при нажатии на отмену не было создано новой рабочей книги? Я вставил макрос ниже:

Sub ExportNewBook() Application.ScreenUpdating = False Dim ThisWB As Workbook Set ThisWB = ActiveWorkbook Set NewBook = Workbooks.Add On Error Resume Next ThisWorkbook.Worksheets("Summary").Range("A1:I100").Copy NewBook.Worksheets("Sheet1").Range("A1").PasteSpecial (xlPasteValues) NewBook.Worksheets("Sheet1").Range("A1").PasteSpecial (xlPasteFormats) NewBook.Worksheets("Sheet1").Range("A:J").Columns.AutoFit NewBook.SaveAs Filename:=ThisWB.Path & "\" & NewBook.Worksheets("Sheet1").Range("A4").Value & "_Summary" NewBook.ActiveSheet.Range("A1").Select Application.ScreenUpdating = True End Sub

РЕДАКТИРОВАТЬ: КОД РАБОТЫ ПОКАЗЫВАЕТ НИЖЕ

Sub ExportNewBook() Application.ScreenUpdating = False Dim ThisWB As Workbook Dim fname As String Set ThisWB = ActiveWorkbook Set Newbook = Workbooks.Add ThisWorkbook.Worksheets("Summary").Range("A1:I100").Copy Newbook.Worksheets("Sheet1").Range("A1").PasteSpecial (xlPasteValues) Newbook.Worksheets("Sheet1").Range("A1").PasteSpecial (xlPasteFormats) Newbook.Worksheets("Sheet1").Range("A:J").Columns.AutoFit fname = ThisWB.Path & "\" & ThisWB.Worksheets("Summary").Range("A4").Value & "_Summary.xls" If Dir(fname) <> "" Then If MsgBox("Summary output already exists, are you sure you want to overwrite?", vbOKCancel) = vbCancel Then Newbook.Close False: Application.CutCopyMode = False: Exit Sub End If Application.DisplayAlerts = False Newbook.SaveAs Filename:=fname Application.DisplayAlerts = True ThisWB.Activate ActiveWorkbook.Worksheets("Summary").Range("A1").Select Newbook.Activate ActiveWorkbook.ActiveSheet.Range("A1").Select Application.CutCopyMode = False Application.ScreenUpdating = True End Sub

Спасибо!

задан Nick 12 июня '15 в 14:07 источник поделиться

qaru.site