【问题标题】:Concatenate using vba - visible cells only?使用 vba 连接 - 仅可见单元格?
【发布时间】:2019-04-23 16:33:58
【问题描述】:

我希望将一张表中的多个单元格连接到另一张表中,然后将该公式复制到最后一行。

但是,我要连接的工作表有隐藏的单元格。所以目前这弄乱了我在目标表上的结果。

有没有办法解决这个问题,让它只拾取可见的单元格?

Dim FitRng As Range, Lastrowteam As Long

Lastrowteam = Cells(Rows.Count, "H").End(xlUp).Row

Sheets("Pipeline simplified").Select
Range("W7").FormulaR1C1 = _
"=CONCATENATE(Pipeline!R[2]C[7],"" "",Pipeline!R[2]C[8],"" "",Pipeline!R[2]C[9],"" "",Pipeline!R[2]C[10])"

Set FitRng = Range("W7:W" & Lastrowteam).SpecialCells(xlCellTypeVisible)
FitRng.FillDown

【问题讨论】:

  • “弄乱我的结果”实际上代表什么?请注意,不合格的Worksheet 成员调用(CellsRange)隐含地引用了ActiveSheet 的任何工作表。结果是否写入了错误的工作表?尝试使用特定的 Worksheet 对象引用来限定 CellsRange 调用。或者它正在填充隐藏行?尝试分配给.SpecialCells(xlCellTypeVisible).FormulaR1C1
  • 当我想避开隐藏单元格时,我会从隐藏单元格中获取结果。这有意义吗?

标签: excel vba


【解决方案1】:

根据您问题中提供的代码,这样的事情应该适合您:

Sub tgr()

    Dim wb As Workbook
    Dim wsData As Worksheet
    Dim wsDest As Worksheet
    Dim rData As Range
    Dim rDest As Range
    Dim DataCell As Range
    Dim aResults() As String
    Dim i As Long

    Set wb = ActiveWorkbook
    Set wsData = wb.Worksheets("Pipeline Simplified")   'Sheet where you are getting the concatenated data
    Set wsDest = wb.Worksheets("Sheet1")                'Sheet where the results will be output
    Set rDest = wsDest.Range("A2")                      'Cell on destination sheet where output results will start

    On Error Resume Next
    Set rData = wsData.Range("G2", wsData.Cells(wsData.Rows.Count, "G").End(xlUp)).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If rData Is Nothing Then Exit Sub   'No visible cells
    If rData.Row < 2 Then Exit Sub      'No data

    ReDim aResults(1 To rData.Cells.Count, 1 To 1)
    For Each DataCell In rData.Cells
        i = i + 1
        aResults(i, 1) = DataCell.Value & " " & DataCell.Offset(, 1).Value & " " & DataCell.Offset(, 2).Value & " " & DataCell.Offset(, 3).Value
    Next DataCell

    rDest.Resize(UBound(aResults, 1)).Value = aResults

End Sub

【讨论】:

  • 这用于连接可见单元格中的值,但将 OP 的逻辑从计算/公式更改为纯值 - 可能满足 OP 的需求,但他们应该知道修改任何单独的连接值将不再重新计算结果列(即需要重新执行宏来更新值)。
  • @MathieuGuindon 这是一个很好的观点,我没有考虑过。我将进入 W 列的公式解释为连接值的占位符,因为该公式与其连接的数据放在同一个工作表上,并且在问题中 OP 指定他希望结果位于不同的工作表上,所以这只是跳过那个(诚然,解释的)中间步骤。如果确实需要生成公式,我一定会更新答案。
  • 谢谢老虎 - 会试试这个!就这样我知道(因为我正在努力变得更好) - 这是细化单元格以连接的行?
  • 下标超出范围错误 - aResults(i, 1) = DataCell.Value & " " & DataCell.Offset(, 1).Value & " " & DataCell.Offset(, 2).Value & " " & DataCell.Offset(, 3).Value。这是因为 DataCell 没有定义吗?
  • @SuperLoz 我无法重现该错误。只有当 aResults 对 rData 来说不够大时才会发生这种情况,但绝不应该是这种情况,因为它是基于 rData 定义的。我需要查看您的数据是什么样子才能尝试重现该错误。同时,您可以尝试将ReDim 行更改为ReDim aResults(1 to 65000, 1 to 1),看看是否有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多