Excel VBA-将范围从仅使用一列扩展到使用多列

时间:2018-07-02 19:07:19

标签: excel vba excel-vba

我有一段工作代码,可以查看列值,复制这些值,并剥离该值的“ speed”组成部分-将“ 200 Mbps”变成“ 200”,等等。

他们更新了我的源数据,并且这些值现在分为三列-AC,AD,AE,而不仅仅是AC。因此,值可以存在于任何列和任何行中,可以是Gbps和Mbps等。

最后,我需要三列的总和X行数。我下面有示例数据。

我如何(甚至什至可以)修改此现有代码,以解决另外两列的问题。我想知道字典方法在这一点上是否正确。它最初是在其他人的建议下添加的。

Dim Cla As Range


With CreateObject("scripting.dictionary")
    For Each Cla In wbFrom.Sheets("Sheet0").Range("AC9", Range("AC" & Rows.Count).End(xlUp))

        Cla.Value = Replace(Cla.Value, " Mbps", "")
        Cla.Value = Replace(Cla.Value, " Gbps", "")

        If Not .exists(Cla.Value) Then
        .Add Cla.Value, Nothing
        End If
    Next Cla

     wbTo.Sheets("Sheet1").Range("D13").Resize(.Count).Value = Application.Transpose(.keys)
    End With

我不太了解IfWith循环以及它们如何与keysTranspose这样结合。 ((感谢TinMan提供的信息)

我尝试将其移出,但在循环外使用会破坏代码。本节中是否有需要更新的内容?

 If Not .exists(Cla.Value) Then
                .Add Cla.Value, Nothing
                End If
            Next Cla

一些示例数据如下所示:注意每个元素都在自己的行上。

AC  AD  AE
300     

        123

72      


    200 



        101

300粘贴在它所属的位置,但我认为没有其他东西加起来或被抓住。另外,当数据看起来像THIS时,它将粘贴两个值而不是一个值: 请注意,现在300和123处于同一行,300粘贴到目标单元格中​​,123粘贴到其下面的两个单元格中。

AC  AD  AE
300     123

72      


    200 


        101

3 个答案:

答案 0 :(得分:2)

示例1

使用Range.Resize()扩展目标列的数量。

For Each Cla In wbFrom.Sheets("Sheet0").Range("AC9", wbFrom.Sheets("Sheet0").Range("AC" & Rows.Count).End(xlUp)).Resize(, 3)

Next

示例2

在范围内设置一个辅助变量,并使用Range.Resize()扩展目标列的数量。

Dim Target As Range
With wbFrom.Sheets("Sheet0")
    Set Target = .Sheets("Sheet0").Range("AC9", .Range("AC" & Rows.Count).End(xlUp)).Resize(, 3)
    Debug.Print Target.Address
End With

附录

这将除去“ Mbps”和“ Gbps”并插入和a;数字进入Range("D13")

With wbFrom.Sheets("Sheet0")
    Set Target = .Range("AC9", .Range("AC" & .Rows.Count).End(xlUp)).Resize(, 3)


    For Each Cla In Target

        Cla.Value = Replace(Cla.Value, " Mbps", "")
        Cla.Value = Replace(Cla.Value, " Gbps", "")

    Next Cla

    .Range("D13").Value = WorksheetFunction.Sum(Target)

End With

答案 1 :(得分:1)

我不确定您是否正确描述了问题。显然,使用字典,您可以获取唯一的独特值列表。但是你说:

  

最后,我需要三列和X的总和   行数。

现有代码使我相信,您将要对不同的速度进行计数……有多少200 Mbps,有多少72 Mpb,等等。

或者是,或者以前的代码无法按预期工作。

假设您正确描述了问题,而您想要的只是总带宽,那么这应该可以解决问题...

SELECT DISTINCT #drinks.loc,#drinks.parent,avail.Avail
FROM #drinks
LEFT OUTER JOIN (
SELECT DISTINCT #drinks.parent, MIN(availnow.maxavailnow / line_num) 
OVER(PARTITION BY parent) as Avail
FROM #drinks
LEFT OUTER JOIN (
            SELECT #drinks.child,SUM(avail_amt) maxavailnow
            FROM #drinks
            LEFT OUTER JOIN (SELECT MAX(a_date) date,loc,child FROM #drinks GROUP BY loc,child) maxx ON #drinks.loc = maxx.loc AND #drinks.child = maxx.child AND maxx.date = #drinks.a_date
            GROUP BY #drinks.child
            ) availnow ON #drinks.child = availnow.child
            ) avail ON avail.parent = #drinks.parent

还有一个查找范围内最后一个单元格的函数(即使列表已被过滤)

int i = 5;
int x = ++i + --i;
int y = i++ + i--;
System.out.println("x=" + x);
System.out.println("y=" + y);

答案 2 :(得分:0)

从对您的问题的评论中,我收集到您想要包含在AC,AD和AE列中的原始输入的总和。您要将这样的总和存储在单元格d13中。由于我的输入有限,因此这是我可以提供的最丑陋的代码:

nRow1 = ActiveSheet.Cells(ActiveSheet.Rows.Count, "AC").End(xlUp).Row
nRow2 = ActiveSheet.Cells(ActiveSheet.Rows.Count, "AD").End(xlUp).Row
nRow3 = ActiveSheet.Cells(ActiveSheet.Rows.Count, "AE").End(xlUp).Row
nRow = Application.Max(nRow1, nRow2, nRow3)
input_range = Range("AC9:AE" & nRow)
acum = 0
For Each cell In input_range
    If Not IsEmpty(cell) Then
       temp = Split(cell, " ")
       acum = acum + CInt(temp(0))
    End If
Next
Range("D13").Value = acum