Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA按钮创建新工作簿的新工作表_Vba_Excel_Excel 2010 - Fatal编程技术网

VBA按钮创建新工作簿的新工作表

VBA按钮创建新工作簿的新工作表,vba,excel,excel-2010,Vba,Excel,Excel 2010,在下面的代码中,我在用户窗体上有一个按钮,它从模板创建一个新工作表,重命名它并在新工作簿以及当前工作簿中打开它。是否需要将其自动化,这样它就不会在当前工作簿中创建新工作表,而只创建新工作簿?另外,它每次都会创建一个新工作簿,以便在创建时将创建的所有新工作表保存到一个工作簿中?任何有帮助的,谢谢 Private Sub btnSave_Click() Dim LastRow As Long, ws As Worksheet Set ws = Sheets("Employee Information

在下面的代码中,我在用户窗体上有一个按钮,它从模板创建一个新工作表,重命名它并在新工作簿以及当前工作簿中打开它。是否需要将其自动化,这样它就不会在当前工作簿中创建新工作表,而只创建新工作簿?另外,它每次都会创建一个新工作簿,以便在创建时将创建的所有新工作表保存到一个工作簿中?任何有帮助的,谢谢

Private Sub btnSave_Click()
Dim LastRow As Long, ws As Worksheet
Set ws = Sheets("Employee Information")
LastRow = ws.Range("A" & Rows.Count).End(xlUp).Row + 1

If Me.cbStores.Value = "Northern / Northmart" Then
Dim newWB as Workbook
Dim thisWB as Workbook
Set thisWB = ThisWorkbook
set newWB = Application.Workbooks.Add

thisWB.Sheets("TEMPLATE").Copy after:=newWB.Sheets("Sheet1")
set sh = newWB.Sheets("TEMPLATE")
' Naming and hyperlink to new sheet
sh.Name = AddEmployeeUF.txtFirstname.Text + AddEmployeeUF.txtMiddleinitial.Text + AddEmployeeUF.txtLastname.Text + "Template"
ws.Hyperlinks.Add Anchor:=ws.Range("F" & LastRow), Address:="", SubAddress:=sh.Name & "!A1", TextToDisplay:="View"

EndIf
End Sub

在不在UserForm代码模块中的普通代码模块中,在模块顶部的任何过程之外执行此操作:

然后,您需要使用其他代码修改您的用户表单代码,因为我没有可用的工作表结构和数据:

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为nothing,未为其分配任何对象值。因此,将使用Workbooks.Add方法创建一个新工作簿,该方法分配给Module1.newWB变量,并且该变量将持续存在,直到您关闭文件,或者如果VBA运行时中出现状态丢失,即中止或终止运行时的未经处理的异常,等等。

您可以按如下方式调整代码:

    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

你能重新措辞或澄清这个问题吗?例如,这有点模棱两可:是否有必要将其自动化,这样它就不会在当前工作簿中创建新工作表,而只创建新工作簿?这也是为什么:它每次都会创建一个新工作簿,以便在创建新工作表时将创建的所有新工作表保存到一个工作簿中?。请清楚地描述期望值是什么,以及实际输出如何偏离这些期望值。设置newWB=Application.Workbooks.add是的,每次运行该过程时,您都在故意创建一个新工作簿。如果不是这样的话,您实际上打算怎么做?我计划在一个工作簿中创建所有新工作表,该工作簿与当前使用的工作簿不同。是否有任何原因使I=1:1?这是一个无意义的循环结构。对,现在我只在一个新工作簿中创建它,这也是我想要的,但现在我需要从“用户表单”按钮创建的所有工作表进入这个新工作簿。不,你没有。应该在那里。我不明白这段代码与你最初发布的代码有多大不同。您是否已经尝试在您的过程中实现我上面概述的方法?是的,foo过程将创建从按钮单击到不同工作簿中形成的所有工作表。然而,我需要所有的工作表从用户表单按钮形成,只放在一个单独的工作簿。工程伟大,但一个问题。超链接已断开。要解决这个问题吗?嗯,超链接部分不是这个问题,而只有一个工作簿是。你可能会想接受这个答案,因为它解决了你原来的问题,然后为新的问题发表一篇新的帖子。非常感谢。
    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