希望为excel制作数据排序VBA脚本。我写了大部分内容,但我被困在一行

时间:2015-08-12 08:31:28

标签: excel vba

编辑:我已经更新了问题,以便更具体地说明问题所在。在发布代码之后,我会详细说明出现了什么问题以及我正在寻找的建议。

感谢目前为止提供的所有帮助。我在这篇文章中会比以前更加彻底。

Sample Dataset 我的数据集看起来像这样。 A列和B列包含每个人的数据,由ID编号表示。 C包含可用于它们的“条目”的数量。每个条目有四个标题。 D到G是我想要填充的单元格。

其余行包含我们要排序的实际数据。 H栏告诉我们是否有可用的数据。第I列再次包含相同的ID号(与行A匹配)。 ID 505有8个条目(仅显示2个),每个条目有4个标题。我想要做的是编写一个脚本,首先复制,为ID 505再创建7行,然后将Entry 1的四个标题放入第一个,将Entry 2放入第二个,依此类推。只有1个Entry,没有必要换新行。因为有400个ID,有些有36个条目,所以我试图让它尽可能自动化。之前的方法是让我编写一个包含1000行的脚本,将每个条目定义为单独的Dim,使用If Entry7 <> "" and Entry 8 = "" Then之类的语句,然后是复制和粘贴8行的特定指令。然而,这将是一个非常长的脚本。

到目前为止,我的内容如下:

Sub EntrySort()


Dim i As Long, k As Long, N As Long, Entry As Range, Rng As Range


    i = 2
    While i <= 400
        Set Entry = Range("K" & i)
        For k = Columns("K").Column To Columns("GB").Column Step 5
            Set Entry = Union(Entry, Cells(i, k))
        Next k
        Set Rng = Range("D" & i)
        N = Application.WorksheetFunction.CountA(Entry)  

        'count the number of entries for each ID'
        If Rng.Offset(, 4) = False Then
            i = i + 1 'skip IDs with no data'
        ElseIf N = 1 Then
            Rng.Offset(, 7).Resize(, 4).Copy
            Rng.PasteSpecial Paste:=xlPasteValues
            i = i + 2

        ElseIf N <> 1
            For X = 1 N
                Rng.Offset(, -3).Resize(, 670).Copy
                Rng.Offset(1, -3).Insert Shift:=xlDown 
                'This should create the number of rows required, based on the number of entries
            Next X
        Else
            Rng.Offset(, 7 + 5 * N).Resize(, 4).Copy
            Rng.Offset(N, 0).PasteSpecial Paste:=xlPasteValues 
            'after the new rows are made, this should copy the data from each entry and past it into its own row.'
            N = N - 1
        End If

        N = N - 1

    Wend
End Sub

问题似乎存在于X to OriginalN... Next陈述中。我希望它重复制作一个新行N次,但是当我执行这段代码时,它似乎跳过了那一部分。这是正确的注释吗?我使用OriginalN作为整数,因为N的原始值(接下来的几行将开始减少它)。这是正确的方法吗?似乎脚本完全跳过这两行并直接进入复制/粘贴部分。

提前致谢!

1 个答案:

答案 0 :(得分:2)

唯一的解释是ElseIf N = OriginalN Then永远不会成立,这意味着在N = Application.WorksheetFunction.CountA(Entry)中,计数永远不会产生N。您可以将程序带入调试器以进行检查。