【问题标题】:Marking an area with a double 'For' loop用双“For”循环标记区域
【发布时间】:2015-10-21 15:44:42
【问题描述】:

我正在尝试执行以下操作:我想将不同的区域(以黄色标记)存储在一个字符串中。第一个黄色区域是 F7:G8,第二个是 I7:J8,依此类推,字符串变为:“F7:G8,I7:J8,L7:M8,F10:G11,I10:J11, L10:M11”。

所以在这个例子中,我在右边有三个区域,在下面有两个。向右和向下的区域数量可能会有所不同,因此我想编写一个代码,我只需要指定向右和向下的区域数量。请注意,第一个区域始终是 F7:G8,因此我可以将其用作参考。现在,在下一个区域之前跳过多少列可能会有所不同,并且在下一个区域之前跳过多少行可能会有所不同。所以我需要考虑到这一点。

我有以下 VBA 代码:

Sub test()
'
' test Makro
'

'

Dim i As Integer, j As Integer
k = 2 'areas downwards'
l = 3 'areas rightwards'

Dim area As String
Let area = "F7:G8" 'first area, always the same'

Dim Upper_letter As String
Let Upper_letter = "F"

Dim Upper_nr As String
Let Upper_nr = "7"

Dim Lower_letter As String
Let Lower_letter = "G"

Dim Lower_nr As String
Let Lower_nr = "8"

For i = 1 To k

    For j = 1 To l

        area = area & "," & Upper_letter & Upper_nr ":" & Lower_letter & Lower_number
    'How do I add 3 letters to both Upper_letter and Lower_letter after each iteration of j?'

    Next j

   upper_nr = upper_nr + 3 'after each iteration of i, add 3'
   lower_nr = lower_nr + 3 'after each iteration of i, add 3'

Next i

End Sub

所以我看不到如何在最里面的循环中添加字母。

【问题讨论】:

  • 使用单元格(行,列)。地址(假,假)。列可以是数字。
  • 您可能想研究创建命名范围。你可以做单独的,或者它也会允许不连续的范围。
  • 感谢两位的评论。 @ScottCraner 我以前从未听说过,但我会尝试调查一下。

标签: excel vba for-loop


【解决方案1】:

请试试这个:

Sub ErosRam()
    Dim i&, j&, area$, k As Range, r As Range

    Const COL_PERIOD = 3
    Const ROW_PERIOD = 3
    Const REPS_HORIZONTAL = 3
    Const REPS_VERTICAL = 2

    Set r = [f7:g8]
    Set k = r

    For i = 0 To REPS_VERTICAL - 1
        For j = 0 To REPS_HORIZONTAL - 1
            Set k = Union(k, r.Offset(i * ROW_PERIOD, j * COL_PERIOD))
        Next
    Next

    area = k.Address(0, 0)
    MsgBox area   
End Sub

您可以编辑顶部的Const 行来更改周期和重复次数。

【讨论】:

  • 谢谢!非常好!我对 VBA 完全陌生,我只想问:你能解释一下语法:Dim i&, j&, area$, k As Range, r As Range 吗?
  • 最后一个问题,我想使用代码中的范围 k 来保护使用 ActiveSheet.Protection.AllowEditRanges.Add Title:="protect" 的区域, Range:=Range(_"F7:G8,I7:J8,L7:M8,F10:G11,I10:J11, L10:M11"),但我似乎无法替换字符串 " F7:G8,I7:J8,L7:M8,F10:G11,I10:J11, L10:M11" 在带 k 的代码中。也就是说,"Range:=k" 不起作用。我该怎么做?
  • 我提出了一个新问题link
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多