【问题标题】:Mid and Len causes Invalid Procedure Call or Argument 5Mid 和 Len 导致无效的过程调用或参数 5
【发布时间】:2015-02-02 21:07:40
【问题描述】:

我正在使用以下代码从列中拆分关键字。但是,它不断向我抛出主题错误。我怀疑这与我的 Len 或 Mid 有关。

Sub ConcatenateTLS()

  Dim x As String
  Dim ws As Worksheet
  Dim colLen As Integer

  On Error GoTo ER

  Set ws = ThisWorkbook.Worksheets(1)

  x = InputBox("Enter your Column Label")

  LR = ws.Cells(Rows.Count, x).End(xlUp).Row

    For i = 2 To LR
        colLen = Len(ws.Cells(i, 1).Value) - 20
        If colLen <> 0 Then
            ws.Cells(i, 8).Value = Mid((ws.Cells(i, 1).Value), 15, colLen)
        End If

    Next
ER:
  MsgBox Err.Description & " " & Err.Number

End Sub

【问题讨论】:

  • colLen = Len(ws.Cells(i, 1).Value) - 20 行的目的是什么?我想您可能会遇到colLen 可能是负数的问题。如果是这种情况,您可以通过将 If 语句更改为 If colLen &gt; 0 Then 来修复它。
  • 使用中间窗口来帮助解决这些问题也很有用,例如它正在崩溃的值。您可以在循环内键入Debug.Print colLen,在中间窗口Ctrl+GView &gt; Intermediate Window(在IDE 中)它每次都会打印出该值。一个非常有用的工具。
  • 嗨所以ColLen的目的是从A列上的字符串中切出关键字
  • 当单元格中值的长度小于20时,你想要什么样的行为?
  • 在这种情况下基本上是简单地移动到下一个对象下一行

标签: vba excel


【解决方案1】:

问题是您将负数 colLen 传递给 MID 函数。尝试添加一些条件处理来防止这种情况发生。

【讨论】:

    【解决方案2】:

    这可能是另一种选择:

    Sub M_snb()
      On Error Resume Next
      ActiveSheet.UsedRange.Columns(InputBox("which column ?")).Name = "snb_002"
    
      MsgBox Join(Filter([transpose(if(snb_002="","~",if(len(snb_002)>20,left(snb_002,len(snb_002)-20),snb_002)))], "~", False), vbLf)
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2018-07-25
      相关资源
      最近更新 更多