循环通过命名范围

时间:2016-08-15 10:11:09

标签: excel-vba vba excel

我的工作表包含一系列格式为使用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对象'_worksheet'的方法'范围'失败。有什么想法为什么?以及如何解决它。

谢谢

3 个答案:

答案 0 :(得分:1)

您需要检查单元格的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

答案 1 :(得分:0)

如果您的值是货币格式,那么使用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. 在随机单元格中键入随机值,例如单元格A1中的100
  2. 选择单元格并按F1(调出单元格格式对话框)
  3. 在左侧导航栏中选择Currency
  4. Symbol下拉菜单
  5. 中选择所需的货币格式
  6. 点击OK
  7. 现在再次按F1
  8. 在左侧导航栏中选择Custom
  9. 右侧导航现在将显示正确的格式
  10. 这一切看起来有点像辛勤工作。我很想知道是否有更简单的方法表面!

答案 2 :(得分:-1)

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

此外,除非您的命名范围是工作簿范围,否则我建议您添加其工作表规范以确保所有内容都以可预测的方式运行。

e.g。

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

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