填写第二列中的特定单元格 - vba excel

时间:2014-07-31 09:59:53

标签: excel vba excel-vba

这是我的代码:

Sub fillcells()   

     Dim rngA As Range                  
     Dim arrayFinal As Variant                  
     Dim i As Long                  

     For Each rngA In Range("A:A") 

        If rngA.Value Like "*-*" Then         
            Debug.Print True         
            ' Split range A value into an array                 
            arrayFinal = Split(rngA.Value, "-")               
            'add n rows below the cells containig "-"                     
            rngA.Offset(1, 0).Resize(UBound(arrayFinal)).EntireRow.Insert Shift:=xlDown         
            For i = LBound(arrayFinal) To UBound(arrayFinal)         
                rngA.Offset(i, 0).Value = arrayFinal(i)         
            Next i   
      End If
     Next rngA  

End Sub

编者注:代码错误,因为If位于For循环内,但结尾(End If)位于Next rngA之后)!这是一个错字还是错误?

在工作表上,我有2个填充列(A和B)。我的代码循环列A并检查包含“ - ”字符的单元格。如果找到它,在该单元格下面添加一个新行,并在A列中的“ - ”之后用字符串填充它。 但我的问题是这样的:在B列中,我之前创建了很多空行。我想用B列中的空行填充字符串。我该怎么做?

更具体,例如:

         column B   

row1:    hello1         
row2:    (empty)         
row3:    (empty)                  
row4:    hello2         
row5:    hello3         
row6:    hello4         
row7:    (empty)      
row8:    hello5                     
...         
rown:    .....

我想要的是这个:

row1:    hello1         
row2:    hello1         
row3:    hello1                 
row4:    hello2         
row5:    hello3         
row6:    hello4         
row7:    hello4      
row8:    hello5                     
...         
rown:    .....

我需要的是一个优化的代码,所以我必须使用(如果可能的话)相同的循环,因为我有很多填充的行。

1 个答案:

答案 0 :(得分:0)

我修改了你的代码(见下文),为你提供了一种做你想做的事情。这可能不是最好的方式,但至少它会让你知道你能做些什么。

Sub fillcells()

  Dim rngA As Range
  Dim rngB As Range ' <~~ NEW CODE
  Dim arrayFinal As Variant
  Dim i As Long

  For Each rngA In Range("A:A")

    If rngA.Value Like "*-*" Then
      Debug.Print True
      ' Split range A value into an array
      arrayFinal = Split(rngA.Value, "-")
      'add n rows below the cells containig "-"
      rngA.Offset(1, 0).Resize(UBound(arrayFinal)).EntireRow.Insert Shift:=xlDown
      For i = LBound(arrayFinal) To UBound(arrayFinal)
        rngA.Offset(i, 0).Value = arrayFinal(i)
      Next i
    End If

    ' NEW CODE STARTS HERE
    Set rngB = rngA.Offset(0, 1)
    If rngA.Value <> vbNullString And rngB.Value = vbNullString Then
      rngB.Value = rngB.Offset(-1, 0).Value
    End If
    ' NEW CODE ENDS HERE

  Next rngA

End Sub

首先,我添加了一个新的Range变量(rngB)。然后,我将其设置为从rngA偏移的单个列。最后,如果单元格列A有一些文本但在B列中为空,那么我复制 B列中上一行的值到B列当前行。所有这些都在您现有的循环中,如您所愿。