0

我正在尝试在 VBA 中执行一个非常简单的命令(将值分配给一个范围)并且收到错误“应用程序定义或 Web 定义错误”。经过一些故障排除后,我认为这与我的工作表的定义有关。这是我的代码:

Sub CommandButton1_Click()
Dim arr() As String
Dim path As String
Dim filename As String
Dim w1 As Workbook
Dim w2 As Workbook
Set w1 = ThisWorkbook
Dim rng As Range
'w1.Worksheets(1).Range(Cells(1, 13), Cells(1, 22)) = 1 **#works perfectly, populates the given cells with 1's**
path = "C:\Users\Nenko\Desktop\"
filename = "D1.csv"
Workbooks.Open filename:=path & filename
ActiveSheet.Columns("A:B").EntireColumn.Delete
ActiveSheet.Columns("F:AQ").EntireColumn.Delete
ActiveSheet.Columns("G:G").EntireColumn.Delete
ActiveSheet.Columns("H:H").EntireColumn.Delete
ActiveSheet.Columns("I:J").EntireColumn.Delete
ActiveSheet.Columns("J:J").EntireColumn.Delete
ActiveSheet.Columns("K:P").EntireColumn.Delete
'Set w2 = Workbooks(path & filename) #subscript out of range
'Set w2 = ThisWorkbook **# application defined or web-defined error in Sheets.Add.Name=arr(a)**
Set w2 = ActiveWorkbook
'Set Range = w2.Worksheets(1).Range(Cells(1, 13), Cells(1, 22)) **# argument not optional**
'Range = 1
'w2.Worksheets(1).Range(Cells(1, 13), Cells(1, 22)) = 1 **#application defined or web-defined error**
EndRow = Sheets(1).Cells(Sheets(1).Rows.Count, "C").End(xlUp).Row
'w2.Worksheets(1).Cells(1, 11) = w2.Worksheets(1).Cells(1, 1).Value **#does nothing**
ActiveSheet.Range("A2:A65536").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ActiveSheet.Range("K:K"), Unique:=True
EndRow2 = Sheets(1).Cells(Sheets(1).Rows.Count, "K").End(xlUp).Row - 1
ReDim arr(EndRow2)
For a = 2 To EndRow2 + 1
arr(a - 1) = w2.Worksheets(1).Cells(a, 11).Value
Next
ActiveSheet.Columns("K:K").EntireColumn.Delete
For a = 1 To EndRow2
Sheets.Add.Name = arr(a)
c = 1
d = 1
For b = 1 To EndRow
If w2.Worksheets(a + 1).Cells(b, 1) = arr(a) Then
w2.Worksheets(1).Rows(c).EntireRow.Value = w2.Worksheets(a + 1).Rows(b).EntireRow.Value
c = c + 1
End If
'If w2.Worksheets(a + 1).Cells(b, 2) = arr(a) Then
'w2.Worksheets(1).Range(Cells(d, 13), Cells(d, 22)) = w2.Worksheets(a + 1).Range(Cells(b, 1), Cells(b, 10))
'd = d + 1
'End If **#this is what I tried to do initially and started getting the error**
Next
Next

End Sub

End Sub

在 # 号之后,我将在将相应行添加到代码时遇到的错误放入其中。

代码所做的是打开第二个工作簿,从其唯一工作表的第一列中获取唯一值,并为每个唯一值创建一个选项卡,其中包含与该值对应的行。它工作得很好,直到我尝试在第二张表 w2 中使用任何形式的 Range,它总是返回某种错误。

在故障排除期间,我发现该命令 w1.Worksheets(1).Range(Cells(1, 13), Cells(1, 22)) = 1用 1 填充工作簿 w1 中的相应单元格。另一方面,该命令 w2.Worksheets(1).Range(Cells(1, 13), Cells(1, 22)) = 1返回“应用程序定义或网络定义错误”

我不明白为什么它适用于一个工作簿而不适用于另一个。我已经尝试以我在 VBA 中所知道的各种方式定义第二个工作簿,但在每种情况下我都会遇到某种错误。

有谁知道第二个工作簿有什么问题?

4

1 回答 1

2

我看到您可以尝试/使用的三个建议。

首先,要设置您的工作簿,请尝试以下操作:

Set w2 = Workbooks.Open(filename:=path & filename)

AFAIK 你不能通过告诉 VB 路径来设置工作簿。你需要先打开它。如果您离开,请注意您的线路将如何工作filename。(但只有set在工作簿打开时才会这样做,否则您必须使用该open行)。这一行完成了打开文件的所有工作,将工作簿设置为w2...所以您不需要(当前已注释掉)接下来的两行。

第二:使用多个工作簿时要注意的另一点是使用时要小心Range。例如,使用这两个工作表

Set ws1 = Sheets("worksheet1")
Set ws2 = Sheets("number2")

Set rng1 = ws1.Range(Cells(1,1),Cells(1,2)) 

不一定会为你工作。您还需要明确说明您正在使用哪个工作表Cells()。这条线更好:

Set rng1 = ws1.Range(ws1.Cells(1,1),ws1.Cells(1,2))

或者,使用With

With ws1
    .Range(.Cells(1,1),.Cells(1,2))
End With

可能发生的情况是您ws2是活动工作表,并且您尝试设置范围rng1 = ws1.range(cells(1,1),Cells(1,1))Cells()被引用的工作表在活动工作表上,但是您尝试在ws2使用的ActiveSheet单元格上设置范围,这不会发生。这将引发错误,您会在您的线路上看到这些错误

w2.Worksheets(1).Range(Cells(1, 13), Cells(1, 22)) = 1. 将此更改为w2.Worksheets(1).Range(Worksheets(1).Cells(1, 13), Worksheets(1).Cells(1, 22)) = 1.

最后,只是要指出这一点,Sheets(1)不一定Sheets("Sheet1")是同一件事。 Sheets(1)指“工作表索引”中的第一个工作表,其中Sheets("Sheet1")指的是名为“Sheet1”的工作表。如果您开始一个新工作簿,默认情况下您将拥有三张工作表(索引为 1、2 和 3)。如果您重命名所有“ws1”、“ws2”、“ws3”,然后添加一个名为“Sheet2”的新工作表,使用Sheets(2)将引用Sheets("ws2"),因为这是索引中的第二个工作表。那有意义吗?

于 2015-11-03T19:27:59.063 回答