【问题标题】:Loop through a named range循环遍历命名范围
【发布时间】:2016-12-21 13:06:20
【问题描述】:

我有一个工作表,其中包含大量使用 vba 格式化为货币的单元格。我想遍历范围内的所有单元格并更改货币格式我正在尝试的代码如下代码:

Dim c As Range
Dim rnge As Range
Dim c as Range

Set rnge = Range("CampusCurrRng")
For Each c In rnge
    If Left(cell, 1) = "£" And cell.Value <> "" Then
        Left(cell, 1) = "R" And cell.Value * 50
    End If
Next

我不断收到错误 1004 Method 'Range' of object'_worksheet' failed。有谁知道为什么?以及如何解决。

谢谢

【问题讨论】:

  • 你在哪一行得到错误?你没有定义cell - 它应该是c吗?
  • 在“For Each c”循环中,您不应该使用“c”而不是“cell”,例如“If Left(c, 1) =”
  • R 是什么货币?南非兰特?
  • 代码是否在工作表模块中?在我看来,使用 Style 会更简单。然后您需要做的就是编辑样式的数字格式,而不是遍历所有单元格。

标签: excel vba


【解决方案1】:

我尚未对此进行测试,但请尝试Dim c as variant。或者,如果选项未设置为显式,则可以完全省略它,因为任何未声明的变量都会自动变暗为变体类型。

此外,除非您的命名范围属于工作簿范围,否则我建议您添加其工作表规范以确保一切运行可预测。

例如

Set rnge = Worksheets("example").Range("CampusCurrRng")

最后,就像 M Lind 所说的那样,它应该是 c 而不是 cell(在第一遍时错过了)。

【讨论】:

    【解决方案2】:

    如果您的值是货币格式,那么使用 left 将不起作用 - 它会拉回第一个数字,而不是货币前缀。

    此代码可以帮助您入门。它将£ 转换为R(南非兰特)。

    Sub CurrencyConverter()
        Dim cl As Range, rng As Range
    
        Set rng = Range("CampusCurrRng")
    
        For Each cl In rng
            If cl.NumberFormatLocal = "£#,##0;[Red]-£#,##0" And cl.Value <> "" Then
                cl = cl * 50
                cl.NumberFormat = "[$R-1C09] #,##0;[Red][$R-1C09] -#,##0"
            End If
        Next
    End Sub
    

    注意事项:

    要检查£,您需要指定货币格式。这很棘手。例如,我在英国,如果我在单元格 A1 中有 100 英镑:

    Range("A1").NumberFormat ~~~> $#,##0_);[Red]($#,##0)
    Range("A1").NumberFormatLocal ~~~> £#,##0;[Red]-£#,##0
    

    你需要使用NumberFormatLocal来接£。换句话说,这段代码会在循环中产生否定的结果:

    If cl.NumberFormat = "£#,##0;[Red]-£#,##0"...
    

    下一点更容易。您需要指定输出货币格式。对于南非兰特,我有:

    cl.NumberFormat = "[$R-1C09] #,##0;[Red][$R-1C09] -#,##0"
    

    要获得您需要的,我会执行以下操作:

    1. 在随机单元格中键入随机值,例如100 在单元格 A1 中
    2. 选择单元格并按F1(打开单元格格式对话框)
    3. 在左侧导航中选择Currency
    4. Symbol 下拉菜单中选择所需的货币格式
    5. 点击OK
    6. 现在再按F1
    7. 在左侧导航中选择Custom
    8. 右侧导航现在将显示正确的格式

    这一切似乎有点像艰苦的工作。我有兴趣看看是否有更简单的方法浮出水面!

    【讨论】:

    • 试过这个。我仍然收到错误 1004,如果监视窗口告诉我 rng 脱离上下文,这意味着什么?
    • 在“Set rng = Range("CampusCurrRng")”行
    • 如果您没有定义名为CampusCurrRng 的范围,您将收到该错误。可能的拼写错误?
    【解决方案3】:

    您需要检查单元格的NumberFormatLeft 在这里不起作用。 见下面的代码

    Dim rnge As Range
    Dim cell As Range
    
    Set rnge = Range("CampusCurrRng")
    For Each cell In rnge
        ' in case you use pound in whatever format
        If InStr(cell.NumberFormat, "£") > 0 And cell.Value <> "" Then
            ' used the Rand default of Excel, can modify this line according to your need
            cell.NumberFormat = "[$R-430]#,##0.00"
            cell.Value = cell.Value * 50
        End If
    Next
    

    【讨论】:

    • InStr(cell.NumberFormat, "£") 将返回 0,因此代码将无法工作(刚刚测试过)。请参阅下面的代码 - NumberFormatLocal 解决了这个问题。您还声明了c,但从不使用它。
    • c 部分刚刚从 PO 中复制,与我所做的几项测试配合得非常好
    【解决方案4】:

    将保留您的数字格式的较短版本

    For Each c In [CampusCurrRng] 
        If c.Text Like "*£*" Then c.Value = c * 50: _
            c.NumberFormat = Replace(c.NumberFormat, "£", "R")
    Next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2018-08-23
      • 2013-05-03
      • 2016-01-01
      相关资源
      最近更新 更多