首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Exel VBA:运行时错误13类型不匹配

Exel VBA:运行时错误13类型不匹配
EN

Stack Overflow用户
提问于 2017-01-13 21:38:49
回答 2查看 719关注 0票数 0

我在Sheet1上有以下列表:

代码语言:javascript
运行
复制
   COLUMN A    COLUMNB             COLUMN C 
1  ADDRESS     Services(s) USED    VEHICLE(S) USED
2  Address1    Service1, Service3  Vehicle1, Vehicle3, Vehicle4  
3  Address2    Service1, Service4  Vehicle1, Vehicle3, Vehicle4
4  Address3    Service2, Service5  Vehicle1, Vehicle2, Vehicle5
5  Address4    Service2, Service3  Vehicle1, Vehicle6 
6  Address1    Service5, Service6  Vehicle2, Vehicle5, Vehicle6 
7  Address2    Service2, Service3  Vehicle2, Vehicle3
8  Address4    Service4, Service6  Vehicle1, Vehicle2, Vehicle3, Vehicle4, Vehicle5, Vehicle6   

在Sheet2上,当我在单元格B4中输入"Address1“时,我希望B列中的输出如下

代码语言:javascript
运行
复制
   COLUMN A    COLUMN B            


4              Address1                                                                 

12             Service1
13             Service3
14             Service5
15             Service6
16
17

50             Vehicle1
51             Vehicle2
52             Vehicle3
53             Vehicle4
54             Vehicle5
56             Vehicle6

下面是我使用的代码:

Worksheet_Change代码 ("Sheet2“模块)

代码语言:javascript
运行
复制
Private Sub Worksheet_Change(ByVal Target As Range)

' call Function only if modifed cell is in Column "B"
If Not IsError(Application.Match(Range("B4"), Worksheets("Google Data").Range("E1:E" & LastRow(Worksheets("Google Data"))), 0)) Then
    If Not Intersect(Target, Range("B4")) Is Nothing Then
        If (Target.Value <> "") Then
            Application.EnableEvents = False
            Call FilterAddress(Target.Value)
        Else
            On Error Resume Next
            MsgBox Target.Address & "Cell can't be blank, Input a value first."
            Err.Clear
            Exit Sub
        End If
    End If
Else
On Error Resume Next
    MsgBox "The Appointment # you entered is incorrect or does not exist. Please try again."
    Err.Clear
    Exit Sub
End If

Application.EnableEvents = True

End Sub

子FilterAddress代码(常规模块)

代码语言:javascript
运行
复制
Option Explicit

Sub FilterAddress(FilterVal As String)


Dim LastRow As Long
Dim FilterRng As Range, cell As Range
Dim Dict As Object
'Dim ID
Dim Vehicle As Variant
Dim VehicleArr As Variant
Dim i As Long, j As Long
Dim Service As Variant
Dim ServiceArr As Variant
Dim x As Long, y As Long
Dim My_Range As Range

With Sheets("Sheet1")
    ' find last row with data in column "A" (Adress)
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

    Set FilterRng = .Range("A1:C" & LastRow)

    .Range("A1").AutoFilter
    ' AutoFilter "Sheet1" according to value in "Sheet2" in Column B
    FilterRng.AutoFilter Field:=1, Criteria1:=FilterVal

    Set Dict = CreateObject("Scripting.Dictionary")

    ' create an array with size up to number of rows >> will resize it later
    ReDim ServiceArr(1 To LastRow)
    j = 1 ' init array counter

    For Each cell In .Range("B2:B" & LastRow).SpecialCells(xlCellTypeVisible)
        ' read values from cell to array using the Split function
        Service = Split(cell.Value, ",")

        For i = LBound(Service) To UBound(Service)
            Service(i) = Trim(Service(i)) ' remove extra spaces from string

            If Not Dict.exists(Service(i)) Then
                Dict.Add Service(i), Service(i)

                ' save Service Name to array >> will use it later for "Bubble-sort" and paste in "Sheet2"
                ServiceArr(j) = Service(i)
                j = j + 1 ' increment ServiceArr counter
            End If
        Next i

    Next cell
    ' resize array up to number of actual Service
    ReDim Preserve ServiceArr(1 To j - 1)

End With

Dim ServiceTmp As Variant
' Bubble-sort Service Array >> sorts the Service array from smallest to largest
For i = 1 To UBound(ServiceArr) - 1
    For j = i + 1 To UBound(ServiceArr)
        If ServiceArr(j) < ServiceArr(i) Then
            ServiceTmp = ServiceArr(j)
            ServiceArr(j) = ServiceArr(i)
            ServiceArr(i) = ServiceTmp
        End If
    Next j
Next i

' now the "fun" part >> paste to "Sheet2"
With Sheets("Sheet2")
    .Range("A1").Value = "ADDRESS"
    .Range("B4").Value = FilterVal
    .Range("C1").Value = "VEHICLE(S) USED"

    ' clear contents from previous run

    .Range("B12:B17").ClearContents
    .Range("B12:B" & UBound(ServiceArr) + 11) = WorksheetFunction.Transpose(ServiceArr)

End With

FilterRng.Parent.AutoFilterMode = False

With Sheets("Sheet1")
    ' find last row with data in column "A" (Adress)
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

    Set FilterRng = .Range("A1:C" & LastRow)

    .Range("A1").AutoFilter
    ' AutoFilter "Sheet1" according to value in "Sheet2" in Column B
    FilterRng.AutoFilter Field:=1, Criteria1:=FilterVal

    Set Dict = CreateObject("Scripting.Dictionary")

    ' create an array with size up to number of rows >> will resize it later
    ReDim VehicleArr(1 To LastRow)
    y = 1 ' init array counter

    For Each cell In .Range("C2:C" & LastRow).SpecialCells(xlCellTypeVisible)
        ' read values from cell to array using the Split function
        Vehicle = Split(cell.Value, ",")

        For x = LBound(Vehicle) To UBound(Vehicle)
            Vehicle(x) = Trim(Vehicle(x)) ' remove extra spaces from string

            If Not Dict.exists(Vehicle(x)) Then
                Dict.Add Vehicle(x), Vehicle(x)

                ' save Vehicle Name to array >> will use it later for "Bubble-sort" and paste in "Sheet2"
                VehicleArr(y) = Vehicle(x)
                y = y + 1 ' increment VehicleArr counter
            End If
        Next x

    Next cell
    ' resize array up to number of actual Vehicle
    ReDim Preserve VehicleArr(1 To y - 1)

End With

Dim VehicleTmp As Variant
' Bubble-sort Vehicle Array >> sorts the Vehicle array from smallest to largest
For x = 1 To UBound(VehicleArr) - 1
    For y = x + 1 To UBound(VehicleArr)
        If VehicleArr(y) < VehicleArr(x) Then
            VehicleTmp = VehicleArr(y)
            VehicleArr(y) = VehicleArr(x)
            VehicleArr(x) = VehicleTmp
        End If
    Next y
Next x

' now the "fun" part >> paste to "Sheet2"
With Sheets("Sheet2")
    .Range("A1").Value = "ADDRESS"
    .Range("B4").Value = FilterVal
    .Range("C1").Value = "VEHICLE(S) USED"

    ' clear contents from previous run

    .Range("B50:B55").ClearContents
    .Range("B50:B" & UBound(VehicleArr) + 49) = WorksheetFunction.Transpose(VehicleArr)

End With

FilterRng.Parent.AutoFilterMode = False
End Sub

我已经发现,如果我输入一个地址,它将给我想要的输出。如果我编辑B4以将地址更改为另一个地址,它也能工作。但是,当我删除单元格B4时,我会收到一条消息,上面写着“运行时错误13类型不匹配。

当我调试的时候,它把我带到了电话线

代码语言:javascript
运行
复制
 Call FilterAddress(Target.Value)

如何更改代码,以便在删除单元格B4时不采取任何操作,并显示一条消息要求用户输入地址?

EN

回答 2

Stack Overflow用户

发布于 2017-01-13 21:45:26

像这样的东西,包括一个额外的检查B4的价值应该是足够的。

代码语言:javascript
运行
复制
If Not Intersect(Target, Range("B4")) Is Nothing Then
        If (Target.Value <> "") Then
            Application.EnableEvents = False
            Call FilterAddress(Target.Value)
        Else
            MsgBox Target.Address & " can't be blank, Input a value first."
        End If
    End If

以防你喜欢用细枝末节的方式做事.

代码语言:javascript
运行
复制
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim strErr As String

    If Not Intersect(Target, Range("B4")) Is Nothing Then
        If IsTargetValid(Target, strErr) Then
            Application.EnableEvents = False
            Call FilterAddress(Target.Value)
        Else
            MsgBox strErr
        End If
    End If
End Sub

Public Function IsTargetValid(rng As Range, ByRef strErr As String) As Boolean

    Dim bResult As Boolean

    bResult = True
    If bResult And IsError(rng) Then
        bResult = False
        strErr = rng.Address & " contains error value."
    End If

    If bResult And rng.Cells.Count <> 1 Then
        bResult = False
        strErr = rng.Address & " contains invalid number of cells."
    End If

    If bResult And rng <> "" Then
        bResult = False
        strErr = rng.Address & " can't be blank, input a value first."
    End If

    '// Keep adding any other condition you want to check.

    IsTargetValid = bResult

End Function
票数 2
EN

Stack Overflow用户

发布于 2017-01-14 12:11:13

实际上,您的Worksheet_Change()事件处理程序适用于我:如果我删除单元格B4,我只会收到“您输入的约会#不正确或不存在。请再试一次”消息。这很好。

也许重构您的代码可以帮助您调试它。

例如,你可以

  • 请求数组对特定的Sub进行排序,如下所示: 亚OrderArray(arrayToOrder作为变体) Dim ServiceTmp作为变式Dim iRow,如果iRow2 ( iRow2 )< arrayToOrder( iRow )那么ServiceTmp = arrayToOrder( iRow )则ServiceTmp = arrayToOrder(iRow) =arrayToOrder(IRow)=()(#en23)=,则为iRow2=iRow+1到UBound(arrayToOrder)排序。如果下一次结束,则结束
  • 要求将唯一和有序的值从范围内获取到如下所示的函数 函数GetOrderedUniqueValuesArrayFromRange(filteredRng ( Range)以变体Dim单元格作为范围Dim arr,变体Dim iArr作为变体,CreateObject(“Scripting.Dictionary") <--动态创建一个后期绑定的'Dictionary‘对象”--不需要使用拆分函数arr = Split(cell.value )为filteredRng从单元格到数组的读取值中的每个单元格添加任何库引用。") iArr = LBound(arr) To UBound(arr) arr(iArr) = Trim(arr(iArr))‘从字符串.item(arr(iArr)) = .item(arr(iArr)) +1下一个单元格GetOrderedUniqueValuesArrayFromRange = .Keys’<--字典键是想要的数组中删除额外的空格,虽然没有有序的OrderArray GetOrderedUniqueValuesArrayFromRange‘
  • 然后您可以按以下方式折叠您的FilterAddress()子代码: ServiceArr (FilterVal As String) Dim FilterRng作为范围Dim VehicleArr作为变体Dim ServiceArr作为表(“Sheet1”)‘--用.Range引用您的“数据”表(“C1”,.Cells(.Rows.Count,"A").End(xlUp))’-引用其A列A:C单元格,从第1行到第A列,最后不空一个.AutoFilter‘<-删除任何预先筛选器.AutoFilter Field:=1,GetOrderedUniqueValuesArrayFromRange(Intersect(.Cells,'filter引用范围在其第一列上具有“FilterVal”值与.Resize(.Rows.Count -1).Offset(.SpecialCells(XlCellTypeVisible)‘<-颇具参考筛选单元跳过标题行ServiceArr = Criteria1:=FilterVal .Columns(2).EntireColumn)’‘<--用引用范围VehicleArr = GetOrderedUniqueValuesArrayFromRange(Intersect(.Cells,第2列中的唯一有序值填充ServiceArr(.Columns(3).EntireColumn)‘--用引用范围的第3列的唯一有序值填充VehicleArr,结尾为.AutoFilterMode = False’<= FilterVal .Range("C1").value = " vehicle (S)“使用.Range("B12:B17").ClearContents的清晰服务内容来自以前运行的.Range("B12").Resize(UBound(ServiceArr) - LBound(ServiceArr) + 1) = WorksheetFunction.Transpose(ServiceArr) .Range("B50:B55").ClearContents‘清澈的车辆内容(来自上一次运行的.ClearContents)(#en21 20#()))- LBound(VehicleArr) + 1) = WorksheetFunction.Transpose(VehicleArr),结尾为End Sub

希望这能帮到你

如果你愿意,请告诉我

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41643844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档