【问题标题】:VBA Excel Swapping values of ranges through temporary arraysVBA Excel通过临时数组交换范围的值
【发布时间】:2021-04-12 22:48:26
【问题描述】:

我创建了一个包含一些数据的电子表格,我想通过宏交换该工作表中范围的位置。 因此,我创建了所有不同范围的数组。

Dim C1G1, C1G2, C1G3, C1G4, C1G5, C1G6  As Variant

C1G1 = Range("A3:D3")

C1G2 = Range("A4:D4")

C1G3 = Range("A5:D5")

C1G4 = Range("A6:D6")

C1G5 = Range("A7:D7")

C1G6 = Range("A8:D8")


Dim C2G1, C2G2, C2G3, C2G4, C2G5, C2G6 As Variant

C2G1 = Range("E3:H3")

C2G2 = Range("E4:H4")

C2G3 = Range("E5:H5")

C2G4 = Range("E6:H6")

C2G5 = Range("E7:H7")

C2G6 = Range("E8:H8")

… etc.

通过输入,我询问我想与电子表格中的另一个范围(的值)交换哪个范围的(值)。我使用输入中的变量将要交换的数组的名称放在一起。示例:C2G4(保存 Range("E6:H6") 中的值)到 C5G3(保存 Range("Q5:T5") 中的值)

为了能够在不覆盖数组值的情况下进行交换(并丢失数据),我将数组的内容放入 2 个中间/临时数组中,然后进行交换:

Dim IntermediateFrom As Variant

Dim IntermediateTo As Variant

当我尝试将“from”数组的值放入中间数组时,我的代码将使用数组的名称而不是数组的内容。 “to”数组也是如此。 当我尝试这种说法时:

IntermediateFrom = ("C" & SearchFromComb & "G" & SearchFromGetal)

IntermediateFrom 数组具有字符串值“C2G5”,而不是 C2G5 数组的内容

IntermediateTo = ("C" & SearchToComb & "G" & SearchToGetal) : 有同样的问题

当我使用时:

IntermediateFrom = C2G4 

数组的值被很好地复制。 同样适用于:

IntermediateTo = C5G3

但我想使用替换值来进行移动。

抱歉,解释的范围很广,但有人可以帮助我吗?

【问题讨论】:

  • 使用一个数组数组,其中 C 和 G 是父数组的两个维度,它在父数组的每个项目中保存一个数组。然后你只需要在父项中引用正确的项来带入子数组。

标签: arrays excel vba move


【解决方案1】:

这是一种方法:

Dim ranges(1 To 2) As Range '<< your ranges of data
Dim tmp, rng1, rng2

'populate the array
Set ranges(1) = Range("A3:D8")
Set ranges(2) = Range("E3:H8")

Set rng1 = ranges(SearchFromComb).Rows(SearchFromGetal)
Set rng2 = ranges(SearchToComb).Rows(SearchToGetal)

tmp = rng2.Value
rng2.Value = rng1.Value
rng1.Value = tmp

【讨论】:

    【解决方案2】:

    您可以使用字典来存储范围,键为 C1G1、C1G2 等。

    在下面的代码中,有些东西是硬编码的,但希望它能证明这个想法。

    Sub SwapRanges()
    Dim dicRanges As Object
    Dim rng As Range
    Dim rngOne As Range
    Dim rngTwo As Range
    Dim I As Long
    Dim J As Long
    Dim tmp As Variant
    
        Set dicRanges = CreateObject("Scripting.Dictionary")
        
        Set rng = Range("A3:D3")
        For I = 1 To 2
            For J = 1 To 6
                Set dicRanges("C" & I & "G" & J) = rng.Offset(J - 1)
            Next J
            Set rng = Range("E3:H3")
        Next I
        
        
        Set rngOne = dicRanges("C1G1")
        tmp = rngOne.Value
        Set rngTwo = dicRanges("C2G5")
        rngOne.Value = rngTwo.Value
        rngTwo.Value = tmp
        
    End Sub
    

    【讨论】:

    • 二维数组的解决方案经过测试,效果很好。由于我不是 VBA 专家,我不会尝试字典解决方案。非常感谢大家!!
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2021-11-24
    相关资源
    最近更新 更多