我试图在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:UsersNenkoDesktop"
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
返回"应用程序定义或web定义错误"
我不明白为什么它适用于一个工作簿而不适用于另一个工作簿。我尝试过用VBA中的各种方法定义第二个工作簿,但在每种情况下都会出现某种错误。
有人知道第二本工作簿出了什么问题吗?
我看到了三个建议,您可以尝试/使用。
首先要设置工作簿,请尝试以下操作:
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()
在活动工作表上,但你试图使用ActiveSheet
单元格在ws2
上设置一个范围,这不会起作用。这将抛出错误,您在线路上看到的错误
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")
表示名称为"图纸1"的图纸。如果启动新工作簿,默认情况下将有三张工作表(索引分别为1、2和3)。如果将它们全部重命名为"ws1"、"ws2"one_answers"ws3",然后添加一个名为"Sheet2"的新工作表,使用Sheets(2)
将引用Sheets("ws2")
,因为这是索引中的第二个工作表。这有道理吗?