【问题标题】:Find last cell in a column with a value and move values to new columns/cells在具有值的列中查找最后一个单元格并将值移动到新列/单元格
【发布时间】:2015-05-03 12:06:40
【问题描述】:

我正在为我的工作编写一个宏,但我很难过。

在我的 Excel 工作表中,我有一列(IE 列),该列的单元格中将包含“每月”、“双月”或“每季”,具体取决于该行中的帐户(每行是一个不同的帐户,并且该帐户可以通过 3 种不同方式中的任何一种进行支付)。某些单元格中可能存在空值,并且每次运行此宏时,都会有不同数量的带有值的行。

我需要将 IE 列中的单元格值移动到同一行中相应的“每月”(B 列)、“双月”(C 列)和“季度”(D 列)列中。

有没有办法:

  1. 获取/查找数据/行的末尾,在 IE 列中(不仅仅是在第一个空值处停止)

  2. 确定 3 个值中的哪一个在 IE 列的每一行中

  3. 将这些值移动到同一行的正确列,具体取决于值(每月 - B 列、双月 - C 列或每季度 - D 列)?

我可以这样做吗:

Dim lastRow As Long

lastRow = ActiveSheet.Range("IE" & Rows.Count).End(xlUp).Row
Do While ActiveCell.Row <=lastRow

然后添加我的代码来做“单元格值移动”部分?

【问题讨论】:

  • 按 Col IE 对数据进行排序,然后您只需将值拖到所需位置即可。如果你真的想要一个 VBA 解决方案,那么你应该首先尝试开始并发布你现有的代码。

标签: vba excel


【解决方案1】:

您可以将 IF 语句放入查看列 IE 的每个列中,例如在 B2 中:

=IF($IE2 = "Monthly",$IE2,"")

然后你可以在 C 和 D 中为其他两个值修改它。

【讨论】:

  • 这是有道理的。但是有没有办法通过宏来做到这一点?这需要在我负责更新的一个非常大的、多模块的宏中。宏实际上做了很多不同的事情——这只是一小部分。 (感谢您的回复!)
  • (抱歉 - 我真的是 VBA 新手。)
  • 查看 Federico 上面的回答,它应该会引导您走上正确的道路,但可能需要修改,因为我对他的回答发表了评论。
【解决方案2】:

试试这样的:

Sub yourcode()

LastRow = Range("IE50000").End(xlUp).Row

'I assume values begin at row 2

For i = 1 To LastRow
    Select Case True

    Case IsError(Cells(1 + i, "IE"))
     Nerrors = Nerrors + 1
    Case Cells(1 + i, "IE") = ""
     NBlanks = NBlanks + 1

    Case Cells(1 + i, "IE").Value = "monthly"
        m = m + 1
        Cells(1 + m, "B") = Cells(1 + i, "IE")

    Case Cells(1 + i, "IE").Value = "bimonthly"
         b = b + 1
         Cells(1 + b, "C") = Cells(1 + i, "IE")

    Case Cells(1 + i, "IE").Value = "quarter"
        q = q + 1
        Cells(1 + q, "D") = Cells(1 + i, "IE")

    End Select

Next i

End Sub

我想这就是你想要的。

【讨论】:

  • 一目了然,我不确定您的 m、b 和 q 值是否正确表示要编辑的正确行。但是如果你用 i 替换字母,它应该会填充正确的行。
【解决方案3】:

在相关工作表处于活动状态时运行以下命令。

Private Sub Process()

    Dim v As Variant, vOut As Variant
    Dim i As Long, j As Long, lLastRow As Long

    Const COL = 239 'IE

    With ActiveSheet
        lLastRow = .Cells(.Rows.Count, COL).End(xlUp).Row
        v = .[a1:ie1].Resize(lLastRow).Value2
        ReDim vOut(1 To lLastRow, 1 To 3)
        For i = 1 To UBound(v)
            If Len(v(i, 2)) Then vOut(i, 1) = v(i, 2)
            If Len(v(i, 3)) Then vOut(i, 2) = v(i, 3)
            If Len(v(i, 4)) Then vOut(i, 3) = v(i, 4)
            If Len(v(i, COL)) Then
                Select Case LCase$(v(i, COL))
                    Case "monthly":   vOut(i, 1) = v(i, COL)
                    Case "bimonthly": vOut(i, 2) = v(i, COL)
                    Case "quarterly": vOut(i, 3) = v(i, COL)
                End Select
            End If
        Next
        .[a1].Offset(, 1).Resize(lLastRow, 3) = vOut
    End With

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2018-04-22
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多