在另一个工作簿中创build子例程

我在一个工作簿上创build了一个打开另一个无macros工作簿的button。 transposeDataMatrices是将在打开的工作簿中的工作表上运行的子项:

 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 

transposeDataMatrices是以下严重截断的代码( ReportBook是在trasposeDataMatrices中工作的工作簿的全局variables; cArray是全局数组):

 Public Sub transposeDataMatrices() ReportBook.Activate rowCounter = finWkst.UsedRange.Rows.Count For ii = 1 To wsCount Worksheets(ii).Activate pullModelData (ii) ' just pulls some data, off ii worksheet in ReportBook ReDim indexIDArray(0 To 504) As Integer Dim j as Integer: j = 0 For Each catName In cArray Dim totRange As Range Set catTitle = Worksheets(ii).UsedRange.Find(catName) If Not catTitle Is Nothing Then catTitle.Offset(2, 0).Offset(0, 1).Select ReportBook.Worksheets(ii).Range(Selection, Selection.End(xlToRight).Offset(0, -1)).Select ReportBook.Worksheets(ii).Range(Selection, Selection.End(xlDown)).Select Set totRange = Selection Else Set totRange = Cells("A1") EndIf indexIDArray(j) = j Next equipModelVersion rowCounter, indexIDArray rowCounter = finWkst.UsedRange.Rows.Count Next ii End Sub Sub equipModelVersion(rowCounterDummy As Integer, indexArrayDummy() As String) ReportBook.Activate finWkst.Activate iCol = 1: Set indexRange = Range(Cells(rowCounterDummy + 1, iCol), Cells(rowCounterDummy + 1 + UBound(valueArrayDummy, 1), iCol)) Dim j As Integer: j = 0 For I = rowCounterDummy + 1 To rowCounterDummy + 1 + UBound(valueArrayDummy, 1) Cells(I, iCol) = indexArrayDummy(j) j = j + 1 Next End Sub Sub initializeWorkspace() ReportBook.Activate finWkst.Activate Range("A1").Value = "IndexID" Range("B1").Value = "ModelID" Range("C1").Value = "UserVersion" Range("D1").Value = "Equipment" Range("E1").Value = "Date" For ii = LBound(cArray) To UBound(cArray) Cells(1, ii + 5).Value = cArray(ii) Next End Sub 

我有两个问题:

首先 ,当equipModelVersion运行时,它会将工作簿的单元格中的值存储在工作表所在的工作表中,而不是打开的工作簿中存储值的工作表中。

我该如何纠正?

我尝试激活特定的工作表,使用with语句,以及我在Stack Overflow上find的其他一些快速的东西,但没有任何工作。

其次 ,当我debuggingtransposeDataMatrices并分开时,下面的行工作:

  Set totRange = Range(Range(Selection, Selection.End(xlToRight).Offset(0, -1)), Selection.End(xlDown)) 

在我用button转入工作簿的macros中,它不再有效,所以我必须用下面的方法解决它:

  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)正在失去焦点。

在使用对象时总是声明父对象是个好习惯。 简单的方法是声明父对象是一个variables。

在这种情况下:

 Dim ws as worksheet set ws = ReportBook.Worksheets(ii) 

那么用这两条线就可以用一个表述

 with ws Set totRange =.Range(Selection, Selection.End(xlDown)) end with 

您应该避免使用.select命令。 在这里看到伟大的信息。 使用它只会使代码变得更加难以find错误。