Excel VBA - 排序值和变量

时间:2017-07-19 10:37:14

标签: excel vba excel-vba

如果你在vba中有变量和值 是否可以将它们从最大值分类为最小值,还可以将它们与变量匹配。 例如,如果你有VBA:

Sub sort()
...
x = 5
y = 3
z = 8
...
End sub

在excel中你得到(在A列变量中,在B列值中):

 A  B
 z  8
 x  5
 y  3

分类8,5,3非常容易。 但是如何在正确的位置添加z,x,y?

2 个答案:

答案 0 :(得分:1)

AFAIK没有办法完全按照你的要求去做。变量名称是代码的一部分;使用和访问它们作为数据需要reflection这不是Excel VBA提供的*。

但我不认为你所要求的是通过很长的路要达到你想要的东西的最好方法。您似乎需要一种存储(名称,值)对并访问名称和值的方法。一种直接的方法是使用Dictionary对象。

如果您需要不同的功能,还有其他选择,例如:使用一对数组(一个用于保存名称,一个用于保存值) - 为了使这个更整洁,你可以编写一个类来保持两者在一起并实现你需要的任何函数作为方法。

一旦你有了(名称,值)对,在排序列表中输出它们就很简单了。最简单的方法是将它们写入电子表格,然后使用Excel的内置Range.Sort(参见MSDN documentation)。

将所有内容放在一起(请注意,这需要引用Microsoft Scripting Runtime对象的Dictionary库:

Dim dict As New Dictionary
Dim ws As Worksheet, rng As Range
Dim ky As Variant, itm As Variant

Set ws = ThisWorkbook.Worksheets(1)

'Add items to dictionary
dict.Add "x", 5
dict.Add "y", 3
dict.Add "z", 8

'You can use these in code like this:
For Each ky In dict.Keys
    Debug.Print "The value of " & ky & " is " & dict(ky)
Next ky
'you can change values
dict.item("z") = 10
dict.item("z") = 8

'Output the values and keys (the key/value arrays are horizontal while
'the range is vertical, hence transpose)
Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(dict.Count, 2))
rng.Columns(1).Value = Application.Transpose(dict.Keys)
rng.Columns(2).Value = Application.Transpose(dict.Items)
'Sort them
rng.Sort Key1:=ws.Range("B1"), Header:=xlNo

*不容易 - 可以通过VBProject访问的某些对象,这些对象允许对代码的有限访问。但是使用它来做你要求的事情几乎是不可能的。

答案 1 :(得分:0)

在VBA中,变量之间没有顺序。您可以确定x是否大于y,但这对您没有帮助,因为您需要特定的顺序。
我的回答并不完全是你要求的,但我怀疑它无论如何都会帮助你 由于您已将输出输出到工作表,尽管未排序,但更容易对其进行排序。只需将A列和B列与B列作为主列进行排序 在代码中执行此操作有点复杂。您需要将名称(x,y,z)和值(8,5,3)放入数组中,然后对数组进行排序。之前已经多次描述了如何排序数组(例如:Excel VBA Quickest way to sort an array of numbers in descending order?