Vba 在一个工作簿中创建在另一个工作簿上工作的子例程
我在一个工作簿上创建了一个按钮,用于打开另一个无宏工作簿Vba 在一个工作簿中创建在另一个工作簿上工作的子例程,vba,excel,Vba,Excel,我在一个工作簿上创建了一个按钮,用于打开另一个无宏工作簿TransportaMatrices是将在打开的工作簿中的工作表上运行的子项: Private Sub CommandButton21_Click() Set BEEBook = ThisWorkbook FileSelect = Application.GetOpenFilename(FileFilter:="Excel Files (*.xl*), *.xl*", Title:="Please select the report to
TransportaMatrices
是将在打开的工作簿中的工作表上运行的子项:
Private Sub CommandButton21_Click()
Set BEEBook = ThisWorkbook
FileSelect = Application.GetOpenFilename(FileFilter:="Excel Files (*.xl*), *.xl*", Title:="Please select the report to import")
If FileSelect = "False" Then Exit Sub
Set ReportBook = Workbooks.Open(FileSelect)
transposeDataMatrices
End Sub
在traspostatamatrices
中有以下严重截断的代码(ReportBook
是在traspostatamatrices
中工作的工作簿的全局变量;cArray
是全局数组):
我有两个问题:
首先当运行equipModelVersion
时,它将值存储在按钮所在工作表的工作簿单元格中,而不是打开的工作簿中,存储在为存储值而创建的工作表中
我如何纠正这一点
我尝试使用with语句激活那个特定的工作表,以及在堆栈溢出中找到的一些其他快捷方法,但都不起作用
其次,当我调试转置矩阵
并将其单独调试时,下面这行代码起作用了:
Set totRange = Range(Range(Selection, Selection.End(xlToRight).Offset(0, -1)), Selection.End(xlDown))
在我用按钮传输到工作簿的宏中,它不再工作,因此我必须用以下方法解决它:
ReportBook.Worksheets(ii).Range(Selection, Selection.End(xlToRight).Offset(0, -1)).Select
ReportBook.Worksheets(ii).Range(Selection, Selection.End(xlDown)).Select
Set totRange = Selection
只是看起来很糟糕
为什么VBA在代码完全相同但扩展的情况下对此如此愚蠢?VBA并不聪明,它只会做你告诉它做的事,而不会做你认为你告诉它做的事 我的猜测是,在某个地方,
ReportBook.Worksheets(ii)
正在失去焦点
使用对象时始终声明父对象是一种很好的做法。简单的方法是将父对象声明为变量
在这种情况下:
Dim ws as worksheet
set ws = ReportBook.Worksheets(ii)
然后,对于有问题的两行,请使用带有语句的
with ws
Set totRange =.Range(Selection, Selection.End(xlDown))
end with
应避免使用。选择命令。有关这方面的详细信息,请参阅。使用它只会弄脏代码,使查找错误变得更加困难。VBA并不聪明,它只会做你告诉它做的事,而不会做你认为你让它做的事
我的猜测是,在某个地方,ReportBook.Worksheets(ii)
正在失去焦点
使用对象时始终声明父对象是一种很好的做法。简单的方法是将父对象声明为变量
在这种情况下:
Dim ws as worksheet
set ws = ReportBook.Worksheets(ii)
然后,对于有问题的两行,请使用带有
语句的
with ws
Set totRange =.Range(Selection, Selection.End(xlDown))
end with
应避免使用。选择命令。有关这方面的详细信息,请参阅。使用它只会弄脏代码,使查找错误变得更加困难。清除所有。激活命令,只需使用和块即可处理您需要的任何对象(工作簿、工作表等)。然后在with块中使用.Range
或.Cells`而不仅仅是Range
或Cells
,那么它应该可以根据需要工作。我在initiateWorkspace子空间中尝试了ReportBook.finWkst:.Range…,但当调试器到达第一个.Range时,它会抛出一个编译错误,我没有工作环境,所以我选择坚持使用显式方式,在这种情况下,它不会发出警告,但也不会实现预期功能。永远不要使用Activate。在VBA中激活的唯一有效目的是1)向用户显示某些内容,2)您需要调用一个可视化Excel方法,该方法只能在激活的工作表上工作,并且没有非可视化的解决方法(这些方法很少)。摆脱所有。激活命令,只需将与块一起使用,即可处理所需的任何对象(工作簿、工作表等)。然后在with块中使用.Range
或.Cells`而不仅仅是Range
或Cells
,那么它应该可以根据需要工作。我在initiateWorkspace子空间中尝试了ReportBook.finWkst:.Range…,但当调试器到达第一个.Range时,它会抛出一个编译错误,我没有工作环境,所以我选择坚持使用显式方式,在这种情况下,它不会发出警告,但也不会实现预期功能。永远不要使用Activate。在VBA中激活的唯一有效目的是1)向用户显示一些东西,2)您需要调用一个可视化Excel方法,该方法只能在激活的工作表上工作,没有非可视化的解决方法(这些方法很少)。另外,Select
是激活敏感的。感谢链接;我将编辑“选择输出”。我正在调试和扩展一位同事很久以前的代码;还没有检查所有的低效率。另外,Select
是激活敏感的。感谢链接;我将编辑“选择输出”。我正在调试和扩展一位同事很久以前的代码;还没有检查出所有的低效率。