【问题标题】:Excel VBA - Loop through column one at a timeExcel VBA - 一次循环遍历第一列
【发布时间】:2015-10-14 03:34:35
【问题描述】:

我正在尝试遍历Sht1 (B2:B138) 中的每一行,并为该循环中的每个项目设置一个“输入”单元格Sht2 (A1),一次一个。然后,“输出”单元格Sht2 (N7) 中的值将被复制回Sht1 (C2:C138)


例如:

Sht2 (A1) = value in Sht1 (B2),然后 Sht1 (C2) = value in Sht2 (N7)

重复

Sht2 (A1) = value in Sht1 (B3),然后 Sht1 (C3) = value in Sht2 (N7)


一遍又一遍,直到它到达列表的底部。最终我可能不得不扩展Sht1 ColB 中的列表,因此我一直试图让它动态评估所需的迭代次数。

我在下面尝试的代码为我提供了所有正确的“输出”,但它们最终没有出现在 Sht2 ColC 的正确单元格中。请看下文。我研究并发现this Q/A 很有帮助,并用它来影响代码。我提前感谢您的帮助。 My workbook 以备不时之需。

Sub fnDescCalc()
'Define the objects

Dim wb As Workbook
Dim Framework As Worksheet
Dim SumFramework As Worksheet
Dim colB As Long
Dim colC As Long
Dim LastcolC As Integer
Dim LastcolB As Long

'Set the Variables
Set wb = ThisWorkbook
Set Framework = wb.Sheets("Framework")
Set SumFramework = wb.Sheets("Sum_Framework")

LastRowcb = Framework.Range("B:B").Find("*", searchdirection:=xlPrevious).Row
colB = 2

LastcolC = 138

'This is the beginning of the main loop
For colC = 2 To LastcolC

'This is the beginning of the nested loop
    For colB = 2 To LastcolB
    SumFramework.Range("A1") = Framework.Range("B" & colB).Value
    colB = colB + 1

Framework.Range("C" & colC) = SumFramework.Range("N7").Value
colC = colC + 1

Next colB

Next colC

End Sub

【问题讨论】:

  • “输出不在正确的位置” - 输出在哪里结束?你预计他们会在哪里结束?您是否 [使用 F8] 逐行运行代码,将鼠标悬停在变量上以查看它们是否会变成您意想不到的东西?
  • 我想我的意思是,如果 Sht1 B2 进入“输入”单元格,那么来自“输出”单元格的值将被粘贴到 C2 中的 B2 旁边。但是当我运行它时,情况并非如此,它们都粘贴在 colC 中,但它似乎是随机的。我将上传我的文件并尝试您的 F8 建议。
  • 好的,我已链接到上面的主工作簿文件

标签: excel vba loops foreach nested-loops


【解决方案1】:

您提供的解释和代码并不真正匹配。所以我知道您想要执行以下操作:

您输入 2 个值。一个搜索值 (SumFramework.Range("A1")) 和一个输入值 (SumFramework.Range("N7"))。现在,工作表“框架”的 B 列中与搜索值匹配的列表中的每个项目都被分配了 C 列中的输入值。如果我的理解有误,请详细说明:)

1。 在您的代码中,LastcolB 永远不会被初始化,因此它将为 0,并且循环永远不会执行。

2。 你只需要一个循环来做[编辑:你在评论中描述的]:

MaxRow = Framework.Range("B:B").Find("*", searchdirection:=xlPrevious).Row
'Alternative if the last row is the actual last row and .Row < 1000:
'MaxRow = Framework.Range("B1000").End(xlUp).Row


For rowB = 2 To MaxRow
    SumFramework.Range("A1") = Framework.Range("B" & rowB).Value
    Framework.Range("C" & rowB) = SumFramework.Range("N7").Value
Next rowB
  1. “For...Next”自动计数。使用colB = colB + 1,您可以跳过每一行。

【讨论】:

  • B 列中的值是静态的,它们是操作可以随时执行的活动类型,并且该静态列表中的每个项目都需要输入到 SumFramework.Range("A1" )。这是唯一的输入。 Excel 在 SumFramework.Range("N7") 中计算输出,即执行该活动所花费的总小时数。然后我想将该总小时数放入其相应活动旁边的列中。因此,我最终会得到一个活动列表,并在其旁边列出花费了多少小时进行这些活动。
  • 嗯,好的。并且在前 138 行中的值是唯一的,然后它们可以再次出现? (否则我不明白你为什么需要两个循环)
  • 从研究看来,我需要为 B2:B138 中的每个值做一些事情(将其复制到输入单元格),然后为 C2 中的每个单元格做一些事情(接收每个唯一的输出) :C138.
  • 我编辑了我的答案。这是你的意思吗?这个过程非常简单 从 B 列取值 --> 复制到“A1” --> 计算“N7” --> 将同一行中的“N7”复制到 B 列。
  • 谢谢be_kehrer!测试了您的解决方案,它运行良好。
猜你喜欢
  • 2012-09-26
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多