【问题标题】:loop to put cell combinations with if statements循环以使用 if 语句放置单元格组合
【发布时间】:2014-01-28 16:01:15
【问题描述】:

我有一张工作表,其中 3 个工作表中的所有数据将从单元格 D1 开始放在彼此下方。 在 A 到 C 列中,将放置刚刚粘贴的列中计算出的单元格组合。 例如:

cell A2 will be: D2 & E2
Cell B2 will be: D2 & E2 & if (G2 = "" ; F2 ; G2)
cell C2 will be: D2 & E2 & if (H2 = "" ; if (G2 = "" ; F2 ; G2) ; H2)

当我只有一列要填充时(A 列),我有:

Sub M_snb()
  for each sh in sheets(Array("uitdraai FD", "uitdraai asw", "uitdraai food"))
    sn=sh.cells(1).currentregion.offset(1).columns(1)
    sp=sh.cells(1).currentregion.offset(1)

    for j=1 to ubound(sn)
      sn(j,1)=sp(j,2)&sp(j,3)&sp(j,4)
    next

    sh.cells(1).currentregion.offset(1).columns(1)=sn
  next
End Sub

这工作快速而完美,但使用 CurrentRegion。 我一直在尝试更改此脚本,以便将其用于其他 2 列(B 列和 C 列),但到目前为止,我还没有成功。

当我更改代码的第一行并将单元格(1)更改为单元格(4)时,我看到代码从单元格 D1 开始,这很好。甚至 currentregion.offset(1) 都是正确的。但是当我添加 .columns(1) 时,我收到一个错误。 (我尝试了所有方法,将 .select 放在最后,并逐步扩展代码以查看会发生什么)。

error 438: this property or method are not supported by this object.

我怎样才能以最有效的方式实现我的目标?

(这是基础,我有额外的if 语句(有时,F 列中单元格的值是“Zelfzorg ASW”,必须更改为“Zelfzorg”

我希望有人可以帮助我并提供代码来执行我想要的操作。

我正在尝试尽可能多地学习这一点,但我不明白上面代码中发生了什么

【问题讨论】:

  • 您会收到该错误,因为.columnn 不是Cell 的属性。我不知道你想做什么,不能听从你的解释。但是如果要选择列,可以使用EntireColumn属性。
  • 感谢您的反应。我想要做的是代码检查 D 列中的单元格是否为空。对于 D 列中的单元格不为空(没有值!)的每一行,代码必须将提到的组合放入 A、B 和 C 列中的单元格中。这必须完成,直到 D 列中的最后一行具有已到达,并且最后一行的 A、B 和 C 列中的单元格填充了正确的组合。我发布的代码是由另一个论坛上的某人建议的,但我想这仅适用于 A 列,因为 CurrentRegion
  • 我根据您的评论发布了答案。我不使用当前区域,我不喜欢它。我也不使用循环,而是使用Range 对象的.Formula 属性。希望这接近你想要的。

标签: vba excel


【解决方案1】:

然后根据您的评论尝试此操作。
这比循环更快。

未测试:

Option Explicit
Sub Sample()

Dim ws As Worksheet
Dim lrow As Long

For Each ws in Thisworkbook.Sheets(Array("uitdraai FD", "uitdraai asw", "uitdraai food"))
    With ws
        lrow = .Range("D" & Rows.Count).End(xlUp).Row
        If lrow > 1 Then '~~> checks whether Column D has value other than header
            .Range("A2:A" & lrow).Formula = "=D2&E2"
            .Range("B2:B" & lrow).Formula = "=D2&E2&IF(G2="""",F2,G2)"
            .Range("C2:C" & lrow).Formula = "=D2&E2&IF(H2="""",IF(G2="""",F2,G2),H2)"
            '~~>next line converts formulas to values, if you don't want it, remove it
            .Range("A2:C" & lrow).Value = .Range("A2:C" & lrow).Value 
        End If
    End With
Next
End Sub

这是你正在尝试的吗?
代码所做的是将您的公式放在 A、B 和 C 列中,直到您在 D 列中具有值的位置。
希望这对你有用。
还没来得及测试,如果遇到问题,就评论吧。

【讨论】:

  • 谢谢! a 列被完美填充。但是在A列被填满后,我得到一个错误:错误1004;应用程序定义或对象定义的错误。之后,这条线被标记为黄色: .Range("B2:B" & lrow).Formula = "=D2&E2&IF(G2="""";F2;G2)"
  • 试试我编辑的帖子。即使您的默认分隔符是分号;,我也应该使用逗号,
  • 我欠你太多了!非常感谢!我不能投票,因为我没有足够的声誉,否则我会投票的!
  • 还有一个问题:有时,在 F 列的单元格中有值“Zelfzorg ASW”。这应该更改为“Zelfzorg”。我怎样才能通过 VBA 获得这个 dan?
  • 啊这很简单,但要确保它没有前导或尾随空格。在If lrow > 1 Then 语句之后将其添加到您的代码中。 .Range("F2:F" & lrow).Replace "Zelfzorg ASW", Zelfzorg, xlWhole
猜你喜欢
  • 2016-10-15
  • 1970-01-01
  • 2018-03-01
  • 2018-02-11
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多