Excel VBA宏根据列中的文本将单元格值复制并粘贴到某些单元格

时间:2011-12-05 13:07:42

标签: excel excel-vba excel-2007 vba

我正在尝试根据文本比较将文本值复制并粘贴到excel中的特定数量的单元格中。

请参阅以下说明:

我有2列A(空白)和B(带值)

enter image description here

在宏之后,这将是最终结果:

enter image description here

它基本上在检测到水果柱并将细胞值粘贴到A行后取底部细胞。注意,在它到达下一个细胞后,它会获取下一个(底部)细胞值。 F123,F124等。

有人可以提供excel vba代码吗?感谢。

2 个答案:

答案 0 :(得分:4)

我不会使用VBA来解决这个问题。我会输入:

=IF(AND(LEFT(B2,1)="F",B2<>"Fruits"),B2,A1)

进入A2并复制下来。这似乎会产生你所寻求的效果。

如果您真的想使用VBA,测试的代码是:

Dim CellValue As String
Dim RowCrnt As Integer
Dim RowMax As Integer

With Sheets("Sheet1")   ' Replace Sheet1 by the name of your sheet
  RowMax = .Cells(Rows.Count, "B").End(xlUp).Row
  For RowCrnt = 2 To RowMax
    CellValue = .Cells(RowCrnt, 2).Value
    If Left(CellValue, 1) = "F" And CellValue <> "Fruits" Then
      .Cells(RowCrnt, 1).Value = CellValue
    Else
      .Cells(RowCrnt, 1).Value = .Cells(RowCrnt - 1, 1).Value
    End If
  Next
End With

以下内容解释了上述代码中可能对新手不明确的那些方面。

宏录像机几乎总是使用范围(“A5”)或范围(“A5:C10”)来指代范围。

似乎有一些命令(对不起,不记得是哪个),这种格式是强制性的,但对于大多数用途,单元格(行,列)更方便。

如果要为工作表“Sheet1”的“A5:C10”范围内的每个数值添加1,下面显示如何使用单元格执行此操作:

Dim CellValue as String
Dim ColCrnt As Integer
Dim RowCrnt As Integer

With Sheets("Sheet1")
  For RowCrnt = 5 to 10
    For ColCrnt = 1 to 3    ' "A" to "C"
      CellValue = .Cells(RowCrnt, ColCrnt).Value
      If IsNumeric(CellValue) Then
        .Cells(RowCrnt, ColCrnt).Value = CellValue + 1           
      End If
    Next
  Next
End With

访问工作表中的单元格会有时间损失,但我更多地使用了CellValue,因为代码可能会因为过多的单元格引用而变得混乱。

注意:在“A5”中,列首先出现,但在单元格(5,1)中,该行首先出现。

您可以使用单元格定义范围。以下将活动表格的“A5:C10”设置为粗体:

Range(Cells(5,1), Cells(10,3)).Font.Bold = True

要解决活动工作表最后一行的A列:

Cells(Rows.Count,"A")

要解决第1行的最后一列:

Cells(1,Columns.Count)

Ctrl +向上,Ctrl +向下,Ctrl +向左和Ctrl +向右可用于从空单元格跳转到下一个单元格,其值在指示的方向上。您可以在VBA中执行相同的操作。但更有用的是,你可以获得光标跳转到的行或列的值,而不会有移动光标的时间代价。

如果光标位于最后一行的B列并按Ctrl + Up,则光标将跳转到最后一行,其中包含B列中的值。以下内容将RowMax设置为活动工作表的行号:< / p>

RowMax = Cells(Rows.Count, "B").End(xlUp).Row

获取第27行的最后一列:

ColMax = Cells(27,Columns.Count).End(xlToRight).Column  

答案 1 :(得分:0)

尝试我的宏

Option Explicit
Sub test()
Dim My_st$
Dim Ro%, Lr%

With Sheets("Sheet1")   ' Replace Sheet1 by the name of your sheet
  Lr = .Cells(Rows.Count, "B").End(xlUp).Row
  Range("a2").Resize(Lr).ClearContents
    For Ro = 2 To Lr
       My_st = .Cells(Ro, 2).Value
       .Cells(Ro, 1) = _
       IIf(My_st Like "[A-Z]#*", My_st, .Cells(Ro - 1, 1))
    Next
End With
End Sub