【问题标题】:How can I order rows in excel based on a ratio through vba?如何通过vba根据比率对excel中的行进行排序?
【发布时间】:2015-10-23 00:11:44
【问题描述】:

第一次在这里发帖,希望我能提供足够的信息来获得帮助。

我在 excel 中有一个数据集,它在第 1 列中包含多个客户端,我想根据 10 块的比率对其进行排序。例如,如果客户端 1 和 2 之间的比率为 60/40,则需要订购 6 行客户端 1、4 行客户端 2、6 行客户端 1、4 行客户端 2,直到数据结束。

有什么办法可以做到这一点,无论是通过在excel中排序还是使用VBA,我已经尝试了几天并且很难过。

谢谢。

【问题讨论】:

  • 按比率,您的意思是“客户 1”出现在您的列表中的次数与“客户 2”出现的次数?列表中是否只有两个客户?
  • 是的,但我需要它是一个可重复的操作,并且客户端的数量会有所不同
  • 那么如果你可以有两个以上的客户,那不就是每个客户出现的次数与条目总数的比值吗?
  • 对不起,我应该说,比率是手动设置的变量。所以数据需要按 10 个块的比例排序,直到一个客户端用完,然后它只是第二个客户端(在 2 个客户端)情况下的剩余部分。对不起,如果我不是很清楚!
  • 可以添加附件吗?我有一个手动示例说明我的意思

标签: excel vba sorting


【解决方案1】:

希望这会有所帮助。这会将您的块放在彼此相邻的列中。我没有对此进行测试,但希望这个想法能让你有所收获。

Sub ClientRatios()

'DataSet is in range A:A
'Make the ratios of the Clients Add up to 10
'You can have a maximum of 10 clients

Dim Nextempty As Range
Dim j As Long
Dim i As Long

'Repeat the following idea for each client and you should get what you're looking for

'+++Client1+++

'=================================
i = Range("Clinet1_Ratio")
ClientName = Range("Clinet1_Name")
'=================================

Total = Application.WorksheetFunction.CountIf(Range("A:A"), ClientName)
Do While Total < 0
    j = i
    c = 2
    Do While j > 0
        If j > Total Then j = Total
        Nextempty = Cells(Cells.Rows.Count, Columns(c)).End(xlUp).Row + 1
        Nextempty = ClientName
        j = j - 1
    Loop
c = c + 1
Total = Total - i
Loop

'+++Client2+++
    'Do the same for all 10 clients

 End Sub

【讨论】:

  • 如果此答案帮助您实现了您所寻找的,请将其标记为。
【解决方案2】:

欢迎来到 SO。这不是一个代码编写服务,所以我会告诉你如何解决这个问题。

我建议您使用 Microsoft Scripting Runtime 库(包含在 Windows 中)中的 Dictionary 对象。链接herehere

  1. 将您的源数据读入dictionary,以便存储客户端名称和每个名称的计数。
  2. 循环遍历您的比率单元格,每次在字典中写入客户端名称,然后减少计数。如果名称的 count = 0,则不要写出该名称。
  3. 当所有客户端名称在字典中计数 = 0 时,退出循环即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2023-03-24
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多