【问题标题】:excel vba convert string to rangeexcel vba将字符串转换为范围
【发布时间】:2016-09-16 16:31:57
【问题描述】:

我正在尝试在 3 个不同的范围上运行一个宏,一个接一个。一旦选择了范围,代码就可以正常工作(定义了变量 F 和 L)。我想将r1-r3 设置为我需要的范围,然后使用字符串变量将范围数字连接在一起。此代码有效,但不提供所选范围内的起始行号和结束行号。这很重要,因为它告诉“TableCalc”宏何时启动和停止代码。然后我想进入下一个范围。感谢您的帮助。

Sub TestRangeBC()

WS.Select

Dim r1 As Range
Dim r2 As Range
Dim r3 As Range
Dim rngx As String
Dim num As Integer
Dim rng As Range

Set r1 = WS.Range("ONE")
Set r2 = WS.Range("TWO")
Set r3 = WS.Range("THREE")

For num = 1 To 3
    rngx = "r" & num
    Set rng = Range(rngx)

    Dim F As Integer
    Dim L As Integer

    F = rng.Row + 1
    L = rng.Row + rng.Rows.Count - 2
    Cells(F, 8).Select

    Do While Cells(F, 8) <> "" And ActiveCell.Row <= L

        'INSERT SITUATIONAL MACRO
        Call TableCalc
        WS.Select
        ActiveCell.Offset(1, 0).Select
    Loop
Next num

End Sub

【问题讨论】:

  • “它告诉 TableCalc 宏何时启动和停止代码”是什么意思?我没有看到使用的任何参数或全局变量。
  • Don't use .Select 在您的“情境宏”部分。这可能会有所帮助。另外,您的命名范围是单行吗?还是多行?如果您使用F8 遍历宏,F 会设置为什么?此外,您需要指定您希望获得 `Cells(F,8) 的工作表。
  • @Tony Abadie 是 TableCalc 与此 Sub 在同一模块中的代码?为什么Cells(F, 8) &lt;&gt; "" 不在Do While 循环中前进?

标签: vba excel macros


【解决方案1】:

这不是答案(作为您的代码的一部分,您想要实现的目标尚不清楚),但它是一种“更简洁”且更有效的方式来编码您在原始帖子中的内容。

Option Explicit

Dim WS              As Worksheet

你原来的 Sub 缩短:

Sub TestRangeBC()

' chanhe WS to your Sheet name
Set WS = Sheets("Sheet1")

Call ActiveRange("ONE")
Call ActiveRange("TWO")
Call ActiveRange("THREE")

End Sub

Sub 将命名范围的名称(您在工作簿中设置)作为字符串获取,并相应地设置范围。

Sub ActiveRange(RangeName As String)

Dim Rng                 As Range
Dim F                   As Integer
Dim L                   As Integer
Dim lRow                As Long

With WS
    Set Rng = .Range(RangeName)

    ' just for debug purpose >> to ensure the right Range was passed and set
    Debug.Print Rng.Address

    F = Rng.Row + 1
    L = Rng.Row + Rng.Rows.Count - 2

    lRow = F

    ' what you are trying to achieve in this loop is beyond me
    Do While .Cells(F, 8) <> "" And .Cells(lRow, 8).Row <= L
        Debug.Print .Cells(lRow, 8).Address
        'INSERT SITUATIONAL MACRO
       ' Call TableCalc
        ' not sure you need to select WS sheet again
        WS.Select
        lRow = lRow + 1
    Loop
End With

End Sub

你想在下面的循环中测试什么,留在循环中的标准是什么?

Do While Cells(F, 8) <> "" And ActiveCell.Row <= L

【讨论】:

    【解决方案2】:

    很难说你可能想做什么

    但可能以下内容可以帮助您澄清并(希望)这样做!

    首先,你不能“组合”变量名

    所以我会使用一组命名范围名称(即String 数组),通过特定的子来填充:

    Function GetRanges() As String()
        Dim ranges(1 To 3) As String
    
        ranges(1) = "ONE"
        ranges(2) = "TWO"
        ranges(3) = "THREE"
        GetRanges = ranges
    End Function
    

    这样你就可以清理你的“主”子代码并只保留更多相关的代码:

    Sub TestRangeBC()
        Dim r As Variant
        Dim ws As Worksheet
    
        Set ws = Worksheets("Ranges") '<--| change "Ranges" to your actual worksheet name
    
        For Each r In GetRanges() '<--| loop through all ranges names
            DoIt ws, CStr(r) '<--| call the range name processing routine passing worksheet and its named range name
        Next r
    End Sub
    

    “main”子循环遍历直接从GetRanges() 收集的命名范围数组,并调用DoIt() 来实际处理当前的范围:

    Sub DoIt(ws As Worksheet, rangeName As String)
        Dim cell As Range
        Dim iRow As Long
    
        With ws.Range(rangeName) '<--| reference the passed name passed worksheet named range
            For iRow = .Rows(2).Row To .Rows(.Rows.Count - 2).Row '<--| loop through its "inner" rows (i.e. off 1st and last rows)
                Set cell = ws.Cells(iRow, 8) '<--| get current row corresponding cell in column "F"
                If cell.value = "" Then Exit For '<--| exit at first blank column "F" corresponding cell
                TableCalc cell '<-- call TableCalc passing the 'valid' cell as its parameter
            Next iRow
        End With
    End Sub
    

    【讨论】:

    • @TonyAbadie,你通过了吗?
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2013-06-06
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多