2014-07-15 15 views
0

我有一个包含〜700行和7列的工作表。我需要每一行只有一个条目。即如果行1在列A,B和C中具有单元值,则应创建两个新行,以便行1在列A中具有一个值,行2在列B中具有一个值,行3在列C中具有一个值。excel宏:对于每行中具有值的单元格,使用该值在下面插入一行

我已经花了几个小时,在此(可惜),但我很不好,我不成气候:

Sub TThis() 
Dim rng As Range 
Dim row As Range 
Dim cell As Range 

'just testing with a basic range 
Set rng = Range("A1:C2") 

For Each row In rng.Rows 
    For Each cell In row.Cells 
If cell.Value <> "" Then 
     'write to adjacent cell 
     Set nextcell = cell.Offset(1, 0) 
     nextcell.Value = cell.Value 
     nextcell.EntireRow.Insert 
    End If 
Next cell 
Next row 
End Sub 

我的问题是,这个代码删除了该行其下(这是不假设发生) 并且它插入两行而不是一行。

谢谢!

+0

最简单的方法是将A1转换为D1,将B1转换为D2,将C1转换为D3等。然后,完成后,您将删除前三列。 Voilà,你的范围是A.你让我为你写一个快速程序来证明这一点。 – Sifu

+0

太棒了!但是,我忘了提到一些相当重要的东西:每行都有一个G中提到的ID 9,当你将A1的值传递给D1等时,是否可以给G中的新行赋予相同的ID? – user3776607

+0

没有想到我的小小快速程序,亚历克斯P速度更快,并有比我更好的答案! – Sifu

回答

1

我读到你的数据到一个数组,删除工作表上的数据,然后写回工作表中的一列(同时检查空格)

例子:

Sub OneColumnData() 
    Dim rng As Range, ids As Range, arr() As Variant, rw As Integer, col As Integer, counter As Integer 

    Set rng = Range("A1:C5") 
    Set ID = Range("G1:G5") 

    arr = rng.Value 
    counter = 1 

    rng.ClearContents 

    For rw = 1 To UBound(arr, 1) 
     For col = 1 To UBound(arr, 2) 
      If arr(rw, col) <> vbNullString Then 
       Range("A" & counter) = arr(rw, col) 
       Range("B" & counter) = ID(rw) 
       counter = counter + 1 
      End If 
     Next col 
    Next rw 
End Sub 
+0

这太棒了!一个更小的东西,每一行都有一个ID(一系列数字和字母)是否有一种方法让每个值紧挨着它的ID?在我最初给出的例子中,例如1,2和3行应该都有相同的ID,但是4行将有不同的ID – user3776607

+0

ID在哪里?在D列? –

+0

G实际上,但我可以将它移动到任何地方 – user3776607

相关问题