我有一段工作代码,可以查看列值,复制这些值,并剥离该值的“ 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
我不太了解If
和With
循环以及它们如何与keys
和Transpose
这样结合。 ((感谢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
答案 0 :(得分:2)
使用Range.Resize()
扩展目标列的数量。
For Each Cla In wbFrom.Sheets("Sheet0").Range("AC9", wbFrom.Sheets("Sheet0").Range("AC" & Rows.Count).End(xlUp)).Resize(, 3)
Next
在范围内设置一个辅助变量,并使用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