在Excel中创建优先级日志 - 两个列表

时间:2014-11-09 20:10:12

标签: excel list excel-vba vba

我正在尝试创建优先级列表。我有6个不同的值,用户输入到工作表中(通过VBA GUI)。 Excel计算这些值并创建优先级编号。我需要在两个表中列出它们(通过一个函数)。当存在重复值时(即ProjA = 23且ProjB = 23),问题就会发挥作用。

我不关心首先列出哪一个,但我尝试过的所有内容都存在次要问题。我的工作簿有两张纸。第一个是输入“原始”数据的位置,第二个是我希望找到两个列表的位置。 *我不想在这些名单中使用枢轴。

Priority Number Proj Name
57  Project Alpha c
57  DUI Button Project
56  asdf
57  asdfsdfg
56  asdfasdf
56  Project Alpha a
56  Project Alpha b
18  Project BAS

列表A(包括值范围1-20和
列表B(包括20-inf的值范围)

So, I want it to look like this:

Table 1 (High Priority)                           Table 2 (Low Priority)
Project BAS                                       Project Apha C
                                                  DUI Button Project
                                                  Etc.

1 个答案:

答案 0 :(得分:0)

通常,StackOverflow不会收到这些开放式问题。你应该试图证明你到目前为止所尝试的内容,以及你变得困惑的确切位置。否则,人们正在为你工作,而不是试图解决具体的错误。

然而,因为你是新来的,我做了一个例外。

您可以通过循环优先级列表并将值复制到相应的列表来开始解决您的问题。对于初学者,我假设优先级值从单元格A2开始,项目名称从单元格B2开始(单元格A1B1将是标题)。我还假设我们正在使用名为Sheet1的工作表。

现在我需要知道优先级/项目名称列表的长度。我可以通过使用由maxRows计算的名为Worksheets.Cells(1, 1).End(xlDown).Row的整数来确定这一点。这给出了常规表中的值的数量(包括标题,A1)。

我继续为每个优先级列表设置列(高/低)。在我的示例中,我将这些设置为列34。然后我清除这些列以删除那里已经存在的任何值。

然后我创建了一些跟踪变量,这些变量将帮助我确定我已经添加到每个列表中的项目数量highPriorityCountlowPriorityCount)。

最后,我遍历原始列表并检查优先级值是低(< 20)还是高(else条件)。使用我在上面创建的跟踪变量将项目名称放入适当的列中。

注意:使用2作为偏移量的任何地方都是因为我在考虑标题单元格(第1行)。

Option Explicit
Sub CreatePriorityTables()
    With Worksheets("Sheet1")
        ' Determine the length of the main table
        Dim maxRows As Integer
        maxRows = .Cells(1, 1).End(xlDown).Row

        ' Set the location of the priority lists
        Dim highPriorityColumn As Integer
        Dim lowPriorityColumn As Integer
        highPriorityColumn = 3
        lowPriorityColumn = 4

        ' Empty the priority lists
        .Columns(highPriorityColumn).Clear
        .Columns(lowPriorityColumn).Clear

        ' Create headers for priority lists
        .Cells(1, highPriorityColumn).Value = "Table 1 (High Priority)"
        .Cells(1, lowPriorityColumn).Value = "Table 2 (Low Priority)"

        ' Create some useful counts to track
        Dim highPriorityCount As Integer
        Dim lowPriorityCount As Integer
        highPriorityCount = 0
        lowPriorityCount = 0

        ' Loop through all values and copy into priority lists
        Dim currentColumn As Integer
        Dim i As Integer
        For i = 2 To maxRows
            ' Determine column by priority value
            If (.Cells(i, 1) < 20) Then
                .Cells(lowPriorityCount + 2, lowPriorityColumn).Value = .Cells(i, 2)
                lowPriorityCount = lowPriorityCount + 1
            Else
                .Cells(highPriorityCount + 2, highPriorityColumn).Value = .Cells(i, 2)
                highPriorityCount = highPriorityCount + 1
            End If
        Next i
    End With
End Sub

这应该产生预期的行为。