在VBA工作簿.add系统地打开两个工作簿

当我尝试在vba中打开一个新的工作簿时 – 从我的个人macros工作簿中的macros – 使用:

Workbooks.Add 

它系统地打开两个工作簿。

当我尝试使用类似的东西时:

 Workbooks("book1").Activate 

它很less起作用,因为“book”之后的数字索引很less与“book1”匹配。

我的最终目的是自动命名创build的工作簿。

然而,vba最终命名为第二个空的工作簿,而不是第一个可取的工作簿。

我有Office 365家庭版。

完整的代码是:

 ******************** Sub ExportNameAndSave() ActiveWindow.Activate ActiveSheet.Select Dim lastrow As Range Dim lastcolumn As Range Dim refnumber As String refnumber = Range("b4").Value Range("A1", Range("a60000").End(xlUp)).Select Set lastrow = Selection Range("A1", Range("a1").Offset(0, 50).End(xlToLeft)).Select Set lastcolumn = Selection Range(lastrow, lastcolumn).Select Selection.Copy Workbooks.Add ActiveWorkbook.Activate ActiveWorkbook.SaveAs Filename:="D:\Common Area\" & refnumber & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False End Sub ******************** 

注意 :我已经通过这个论坛上的几十个技巧,当他们从Excel菜单中打开工作簿时遇到类似的问题。 他们不工作。

请注意,我的问题是关于使用vba代码打开工作簿。

macros一直工作到Workbooks.Add之前。

然而,在这一点上,这是发生了什么事情:

1)它创build一个新的工作簿,并将初始工作簿中包含的初始工作表的内容导出到这个新的工作表中 – 这正是我想要的;

2)然后它打开第二个工作表 – 这不是我想要的 – 并在命令“ActiveWorkbook.Activate”,它select这第二个不受欢迎的工作簿,并实际上成功命名并保存它。

因此,我有一个成功命名和保存的文件,但它是空的内容,因为第二个工作簿是空的。 我想要的是命名并保存包含导出内容的第一个工作簿。

注意 :当我closures所有的Excel工作簿,重新打开启动工作簿,并用“Workbook(”book1“)replace”Workbooks.Add“这一行时,此子工作正常。

但是,由于上述原因,这不会给出可重复的,可靠的结果。

任何帮助,将不胜感激。

我看到很多,如果您的代码中的问题。

  1. 避免使用.Activate/.Select 。 您可能想要了解如何避免在Excel VBAmacros中使用select

  2. 处理对象。 看看我如何声明工作表/范围/工作簿对象

这是你正在尝试?

 Sub ExportNameAndSave() Dim lRow As Long, lCol As Long Dim refnumber As String Dim ws As Worksheet Dim wb As Workbook '~~> Change this to the relevant sheet Set ws = ActiveSheet With ws '~~> Find last row and last column lRow = .Range("A" & .Rows.Count).End(xlUp).Row lCol = .Cells(1, .Columns.Count).End(xlToLeft).Column refnumber = .Range("b4").Value '~~> Set your range Set rng = .Range(.Cells(1, 1), .Cells(lRow, lCol)) '~~> Add a new workbook Set wb = Workbooks.Add '~~> Copy the range to sheet1 of new workbook rng.Copy wb.Sheets(1).Range(rng.Address) End With '~~> Save the new workbook wb.SaveAs Filename:="D:\Common Area\" & refnumber & ".xlsm", _ FileFormat:=xlOpenXMLWorkbookMacroEnabled, _ CreateBackup:=False End Sub 
 Sub ExportNameAndSave() ActiveWindow.Activate ActiveSheet.Select Dim wkbk As Workbook Dim lastrow As Range Dim lastcolumn As Range Dim refnumber As String refnumber = Range("b4").Value Range("A1", Range("a60000").End(xlUp)).Select Set lastrow = Selection Range("A1", Range("a1").Offset(0, 50).End(xlToLeft)).Select Set lastcolumn = Selection Range(lastrow, lastcolumn).Select Selection.Copy Set wkbkSource = Workbooks.Add ActiveWorkbook.Activate ActiveWorkbook.SaveAs Filename:="D:\Common Area\" & refnumber & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False End Sub 

但是,我发现一个完美的工作解决我的问题,如下所示:


Sub ExportNameAndSave()

ActiveWindow.Activate

startingpoint = ActiveWorkbook.Name

ActiveSheet.Select

Dim lastrow As Range Dim lastcolumn As Range Dim refnumber As String

refnumber =范围(“b4”)。值

Range(“A1”,Range(“a60000”)。End(xlUp))。selectSet lastrow = Selection

范围(“A1”,范围(“a1”)。偏移(0,50)。结束(xlToLeft))。select设置lastcolumn =select

范围(lastrow,lastcolumn)。select

Selection.Copy

Workbooks.Add

Dim checkedopenworkbook As Excel.Workbook

对于每个checkedopenworkbook在Excel.Workbooks

  If checkedopenworkbook.Name = "PERSONAL.XLSB" Then Else If checkedopenworkbook.Name = startingpoint Then Else checkedopenworkbook.Activate If ActiveSheet.Range("a1").Value = "" Then checkedopenworkbook.Close Else checkedopenworkbook.Activate checkedopenworkbook.SaveAs Filename:="D:\Common Area\" & refnumber & ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False End If End If End If 

下一个checkedopenworkbook

结束小组