【发布时间】:2020-12-18 14:19:11
【问题描述】:
我正在尝试根据值选择特定工作表。我有客户列表设置,旁边有该客户的工作表名称。从列表中查找工作表的名称是有效的,但是当我尝试设置工作表变量时,它会出错。这是我正在使用的代码:
Public Sub SeparateClients()
Dim MainL As Range: Set MainL = ML.Range("A2", ML.Range("A2").End(xlDown))
Dim ClientsF As Range
Dim cClientS As String
Dim cClient As Worksheet
Dim cClientNR As Range
For Each MainL In MainL.Cells
If MainL.Value = "" Then Exit For
Set ClientsF = CL.Range("A:A")
If ClientsF.Find(MainL.Offset(0, 1).Value, , , xlWhole) Is Nothing Then
MsgBox "Client not found: " & MainL.Offset(0, 1).Value, vbOKOnly, "ERROR: Client not found"
Else
cClientS = ClientsF.Find(MainL.Offset(0, 1).Value, , , xlWhole).Offset(0, 1).Value
Set cClient = Sheets(cClientS)
Set cClientNR = cClient.Range("A1").End(xlDown).Offset(1, 0)
With cClientNR
.Value = MainL.Offset(0, 3).Value
.Offset(0, 1).Value = MainL.Offset(0, 5).Value
.Offset(0, 2).Value = Mid(MainL.Offset(0, 6).Text, 1, 10)
.Offset(0, 3).Value = MainL.Offset(0, 8).Value
.Offset(0, 4).Value = MainL.Offset(0, 15).Value
.Offset(0, 5).Value = MainL.Offset(0, 17).Value
.Offset(0, 6).Value = MainL.Offset(0, 23).Value
.Offset(0, 7).Value = MainL.Offset(0, 28).Value
End With
End If
Next MainL
End Sub
当它到达set cClient = sheets(cClientS) 时,它不会为工作表变量设置工作表。我已经在 Google 上搜索了几个小时,但我似乎无法弄清楚我做错了什么。
【问题讨论】:
-
当行执行给您带来麻烦时,
cClientS的值是多少? -
cClientS = ClientsF.Find(MainL.Offset(0, 1).Value, , , xlWhole).Offset(0, 1).Value这样的构造不受欢迎,因为它们变化无常。如果找不到cClientS,Set cClient = Sheets(cClientS)将无法成功。在那里插入另一个测试。顺便说一句,避免像MainL.Offset(0, 1).Value这样的语法。更好的是,在寻址单元格时使用语法来寻址单元格:您正在谈论ML.Cells(MainL.Row, "B")或ML.Cells(MainL.Row, 2).Value。将此应用于 .Offset(0, 7).Value = MainL.Offset(0, 28).Value,您将看到透明度的差异。