繁体   English   中英

如果使用 vba 的 Excel 电子表格中的单元格为空白,则将一列中文本的最后 3 个字符复制到另一列

[英]Copy last 3 char of text in one column to another column if cell is blank in excel spreadsheet with vba

If cell in Range("H1:H104000") is "" Then
    Range("H1:H104000) = LEFT(Range("D1:D104000), 3
End If

这是我尝试但没有成功的代码。

你错过了循环。 您需要编写循环来遍历单元格集合,即使将单个范围与范围集合进行比较,代码也无法隐式执行此操作。

此外,要比较值,请使用= Is运算符仅用于对象。

Dim Cell As Range
For Each Cell In Range("H1:H104000").Cells
    If Cell.Value = "" Then
        Cell.Value = Right(Cell.Offset(0, -4).Value, 3)
    End If
Next

一旦您遍历 H 列。引用“当前行中的 D 列”的一种简单方法是使用Offset ,它将返回一个相对于给定起始位置的单元格。 在这种情况下,我们只需要向左移动 4 列,所以我这样做.Offset(0,-4)

你可能会考虑

  • 将与工作表相关的公式评估分配给变体数据字段数组data
  • data写回引用的列H而不是循环遍历给定的范围; 这种方法只持续几分之一秒,而通过 VBA 循环遍历每个单元格需要几秒钟:
Option Explicit                         ' head of code module

Sub ExampleCall()
    Dim t As Double: t = Timer          ' start timer
    Dim ws As Worksheet
    Set ws = Sheet1                     ' << change to your project's sheet Code(Name) 
    Dim data As Variant                 ' provide for a 1-based 2-dim datafield array
    'assign worksheet related evaluation to data
    data = ws.Evaluate("=If(IsBlank(H2:H104000),Right(D2:D104000,3),H2:H104000)")
    'write to target   
    ws.Range("H2").Resize(UBound(data), 1).Value = data

    Debug.Print Format(Timer - t, "0.00 secs")    ' 0.20 secs   
End Sub

此外,注意一个工作表相关的评价通过ws.Evaluate(...)保证了完全合格的范围内引用,而Evaluate(...)将需要更详细的适应症像Sheet1!H2:H104000或进一步文本插入ws.Range("H2:H104000").Address(External:=True)到公式字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM