工作簿的定义工作不正常



我试图在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"),因为这是索引中的第二个工作表。这有道理吗?

相关内容

  • 没有找到相关文章