【问题标题】:Run-time error: '-2147417848 (80010108)' in macro运行时错误:宏中的\'-2147417848 (80010108)\'
【发布时间】:2022-10-17 21:05:44
【问题描述】:

如果我在 A 列中输入带有空格的单词(例如:L3 FMA Nest 等),则会出现错误:“运行时错误:'-2147417848 (80010108)' : 对象'Range'的方法'Horizo​​ntalAlignment'失败“。我该如何解决这个问题?

我有这个宏:

Option Compare Text
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 1 Then Exit Sub
    Application.ScreenUpdating = False
    Dim rng As Range, v As Variant
    For Each rng In Target
        v = Split(rng, " ")
        If UBound(v) <> 1 Then Exit Sub
        If Right(rng, 1) <> "m" Then
            rng = v(1) & " " & v(0)
     NumberFormat = "@"
      With Target
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
    End With
    With Target.Font
        .Name = "Calibri"
        .Size = 11
    End With
        End If
    Next rng
    Application.ScreenUpdating = True
End Sub

该宏将数据转换为(任何数字)m(任何数字)M在右边。

例如:

L3 280M
500m FMA
Nest 475m
340m Pr6
720M uT10
etc.

转换成:

L3 280M
FMA 500m
Nest 475m
Pr6 340m
uT10 720M
etc.

【问题讨论】:

  • Application.EnableEvents = False 你正在进入一个无限循环。最后带有“m”的值不会触发更改事件或任何没有一个空格的事件。
  • @Warcupine 我该怎么做?我试图在If Right(rng, 1) &lt;&gt; "m" Then 之后粘贴Application.EnableEvents = False。和Application.EnableEvents = True.Size = 11 End With 之后。但是错误再次出现。你能把完整的代码或一段代码发给我吗?

标签: excel vba


【解决方案1】:

每当您使用 Worksheet Change 时,您都需要禁用事件,否则您的事件会自行触发,从而导致无限循环。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim numberformat As String
    If Target.Column <> 1 Then Exit Sub
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Dim rng As Range, v As Variant
    For Each rng In Target
        v = Split(rng, " ")
        If UBound(v) <> 1 Then GoTo cleanexit
        If Right(rng, 1) <> "m" Then
            rng = trim(v(1) & " " & v(0))
            numberformat = "@"
            With Target
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
            End With
            With Target.Font
                .Name = "Calibri"
                .Size = 11
            End With
        End If
    Next rng
cleanexit:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

【讨论】:

  • 太感谢了!现在我注意到如果输入带有空格L3 的单词,那么当单击输入单词的单元格时,会出现“跳转”。首先,单词L3 在单元格中有一个空格,然后如果再次单击该单元格,它将变为没有空格。如何解决?
  • 修改了rng =
  • 这是工作。但是如果输入两个或多个空格,那么问题又来了。
  • 如果您输入两个或更多空格,它永远不会运行,设计为If UBound(v) &lt;&gt; 1 Then GoTo cleanexit
  • 我知道,但这条线是功能的基础。我不知道您想如何处理通过修改打开的各种路径。删除该行,看看我的意思,在某些情况下会出现错误,在其他情况下会丢失数据,它会格式化某些内容而不是其他内容。我根本没有信息告诉你在这里做什么。
【解决方案2】:

我看到这个宏有几个问题。

首先,正如 Warcupine 指出的那样,您肯定需要在此代码运行时暂停事件。您更改工作表内容,因此在不暂停事件的情况下,每次更改都会收到大量递归调用。这是这个问题的原始错误的原因。

其次,如果有前导空格或多个内部空格,则 v 数组将没有索引 0 和 1 处的值。对此的简单解决方法是使用工作表修剪功能。 VBA 修剪功能仅删除前导和尾随空格,但工作表功能也删除了额外的内部空格。

第三,跳转到 cleanexit 会停止处理目标中任何剩余的单元格。

此外,您每次都在格式化整个目标,而不仅仅是活动的 rng 单元格,您忽略了大写“M”和文本术语以“m”结尾的单元格。您只需格式化那些需要翻转的单元格。

以下代码的一个剩余问题是它会翻转任何具有两个以“M”结尾的术语的单元格。

这是我使用的测试范围:

L3 280M
500m FMA
一 567m 三
巢 475m
340m Pr6
电车
720M uT10
345m RLM

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim numberformat As String
    If Target.Column <> 1 Then Exit Sub
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Dim rng As Range, v As Variant
    For Each rng In Target
        'Worksheet Trim removes leading and trailing spaces and additional internal spaces
        rng = WorksheetFunction.Trim(rng)
        v = Split(rng, " ")
        'Skip any cell with more than two terms but still process remaining targets
        If UBound(v) = 1 Then
            If UCase(Right(rng, 1)) <> "M" Then 'allows upper and lower case 'm'
                rng = Trim(v(1) & " " & v(0))
            ElseIf Not IsNumeric(Left(v(1), 1)) Then 'flips terms where the text term ends in 'm'
                rng = Trim(v(1) & " " & v(0))
            End If
            With rng
                .numberformat = "@"
                .HorizontalAlignment = xlCenter
                .VerticalAlignment = xlCenter
            End With
            With rng.Font
                .Name = "Calibri"
                .Size = 11
            End With
        End If
    Next rng

    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    相关资源
    最近更新 更多