【问题标题】:looping through multiple ranges and concatenating based on condition循环多个范围并根据条件连接
【发布时间】:2017-07-24 20:48:07
【问题描述】:

我有四个具有相同行数的 1 列范围:国家、名称、类别、金额。 Country、Name 和 Category 范围具有字符串值,Amount 范围具有双精度值。我面临的问题是:只要金额高于或低于某个值,我需要获取每个类别和每个名称下的所有国家/地区的字符串。

示例表:

国名类别金额
克罗地亚 Jon Blue 14
挪威 Jon Blue 23
波兰 Rob Green 10
埃及伊娃格林 8
加拿大伊娃粉 32
巴西 Rob Pink 25
瑞士 Rob Pink 35
俄罗斯 Jon Pink 27
瑞典 Rob Black 32
多哥 Rob Black 13
贝宁 Esther Violet 24
摩洛哥 Jon Yellow 36
罗马尼亚 Eva Yellow 35
美国伊娃黄 38
日本 Rob Yellow 34

对于金额 > 20,每个类别的正确字符串结果将是:

Blue: Jon: norway(23)
Pink: Eva: canada(32), Rob: brazil(25), switzerland(35)
Yellow: Jon: morroco(36), Eva: romania(35), usa(38), Rob: japan(34)
etc.

知道如何解决这个问题吗?没有编写代码,因为我什至不知道从哪里开始。正在考虑多维数组,但这超出了我的编码能力......非常感谢任何帮助

【问题讨论】:

  • 为什么不只过滤数据,即使这意味着首先将它们复制到单个块/表中?
  • 那么过滤器会给我一个表中的值列表,我仍然需要以某种方式连接以获得正确的字符串。我想问题是是否有办法做某种类型的循环“对于每个类别,每个名称,连接价值高于或低于价值的国家......

标签: excel vba range string-concatenation


【解决方案1】:

下面的代码将使您接近您想要的。这是输出:

Blue: Jon: norway(23), 

Pink: Eva: canada(32), Pink: Rob: brazil(25), Pink: Rob: switzerland(35), Pink: Jon: russia(27), 
Black: Rob: sweden(32), 
Violet: Esther: benin(24), 
Yellow: Jon: morroco(36), Yellow: Eva: romania(35), Yellow: Eva: usa(38), Yellow: Rob: japan(34), 

您唯一需要做的就是抑制空白第二行、重复颜色输出和每行末尾的“,”之类的内容。但我不想带走你所有的乐趣!如果您对此有疑问,请再次发布。

Option Explicit
Sub test()
Dim r As Range, colorR As Range, resultR As Range
Dim amountR As Range, countryR As Range, nameR As Range
Dim color As String, name As String, country As String, amount As String
Set resultR = Range("A19")
Set r = Range("C2")
Set colorR = r
While r <> ""
  While r = colorR
    Set amountR = r.Offset(0, 1)
    Set nameR = r.Offset(0, -1)
    Set countryR = r.Offset(0, -2)
    If amountR > 20 Then
      If color = r & ": " Or color = "" Then color = "" Else color = r & ": "
      If name = nameR & ": " Then name = "" Else name = nameR & ": "
      country = countryR & "("
      amount = amountR & "), "
      resultR = resultR & color & name & country & amount
    End If
    Set r = r.Offset(1, 0)
  Wend
  If resultR <> "" Then
    resultR = Left(resultR, Len(resultR) - 2)
    Set resultR = resultR.Offset(1, 0)
  End If
  Set colorR = r
Wend
End Sub

【讨论】:

  • 感谢 Tony M,看来我必须引入一些 if 语句来消除颜色和名称的重复?在这里挣扎......有什么想法如何轻松做到这一点?谢谢
  • 我现在已经修改了代码,我认为它几乎完全解决了您的问题。剩下的唯一事情就是合计金额。是的,你是对的,要让事情变得恰到好处确实需要大量的摆弄,我承认我的方法是“快速而肮脏的”。但是,这通常是快速解决问题所需要的。如果重要的话,你总是可以回去让事情变得优雅。如果您还有其他问题,请告诉我。
  • 感谢 Tony M - 这对您有帮助。括号中的金额无需相加
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多