我正在尝试在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中使用任何形式的范围,这总是会返回某种错误。
在故障排除期间,我发现了该命令
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中的各种方式定义第二个工作簿,但在每种情况下我都会遇到某种错误。
有没有人知道第二本工作簿有什么问题?
答案 0 :(得分: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()
位于有效工作表上,但是您&# 39;重新尝试使用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"的新工作表1}}将引用Sheets(2)
,因为它是索引中的第二张表。这有意义吗?