Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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 - Fatal编程技术网

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
是激活敏感的。感谢链接;我将编辑“选择输出”。我正在调试和扩展一位同事很久以前的代码;还没有检查出所有的低效率。