【问题标题】:Copy same range of columns from multiple sheets into summary sheet w/ different columns将多个工作表中相同范围的列复制到具有/不同列的摘要表中
【发布时间】:2014-06-28 20:31:43
【问题描述】:

如果这已经发布,我深表歉意。我无休止地寻找并找到了类似的主题,但不知道如何很好地操作宏以满足我的需求。

我有 344 张数据。在每张纸中,我都有特定范围的数据 (AY125:AY158),我想将其复制到一张纸中。我想要将此数据粘贴到汇总表中,其中表 1 中的数据范围为 A 列,表 2 为 B 列,表 3 为 C 等。

我对 VBA 的了解非常初级,因此在这方面的任何帮助都会很棒。

【问题讨论】:

  • 344张的名字是什么?如果他们有一些模式,那么你可以使用indirect
  • 他们是由他们所在州的部门命名的。所以它从阿拉巴马州的:AL01、AL02、AL03、AL04、AL05、AL06 开始,然后是亚利桑那州的(AZ01、AZ02、AZ03....)
  • 可以使用分区名作为列名,也可以使用=INDIRECT("'" & column_name & "'!AY" & 125)

标签: excel vba


【解决方案1】:

欢迎来到 Stack Exchange。

对于本网站来说,这不是一个好问题。屏幕顶部右侧是“帮助”。单击此处可帮助您提出适当的问题。

对我来说,你的问题最大的错误是你一次要求太多,而你没有表现出对如何解决问题的任何理解。这个网站是为程序员帮助其他程序员发展他们的技能的;它不是为那些不会学习编码的人提供的代码编写服务。

如果您想使用 Excel VBA,您必须学习该语言。你说“......不知道如何很好地操纵宏以满足我的需要。”如果您了解 VBA 的基础知识,您就会知道如何做到这一点。

在网上搜索“Excel VBA 教程”。有很多可供选择。尝试一些并选择一个与您的学习风格相匹配的。当地大学可能会以合理的价格提供简短的课程。我更喜欢书。我参观了一个不错的图书馆,花了半个小时浏览他们的 Excel VBA Primers,然后借了我最喜欢的三个。在家里研究完之后,我买了我最喜欢的那个。我仍然不时参考那本书;良好的投资。学习基础知识不会花很长时间,您的学习时间会很快得到回报。

我会尝试帮助您入门,但请先了解基础知识,然后再尝试其他问题。

Fabricator 正在尝试帮助您解决公式问题。如果它满足您的需求,这可能是最简单的方法。我将向您展示一种 VBA 方法。

您必须将您的需求分解为小步骤。尝试编写一个宏来执行步骤 1。搜索与步骤 1 相关的问题。找到与单个问题相关的问题和答案一定更容易。如果您无法使宏工作,请发布您的代码并说明它的作用以及您希望它做什么。像这样的小问题通常会在几分钟内得到解答。

在第 1 步开始工作后,尝试升级您的宏以执行第 1 步和第 2 步,然后执行第 1、2 和 3 步。您会惊讶于使用这种方法取得进展的速度有多快。

您需要做的第一件事是循环浏览所有工作表。试试:

Option Explicit
Sub Try1()

  Dim InxW As Long

  For InxW = 1 To Worksheets.Count
    Debug.Print Worksheets(InxW).Name
  Next

End Sub

上面的宏将列出每个工作表的名称到即时窗口。即时窗口应位于代码区域下方。如果缺少,请单击 Ctrl+G

这个宏的问题是立即窗口中只有 150 行左右的空间,所以当宏停止时,早期的名称已经从顶部滚动了。

现在试试:

Option Explicit
Sub Try2()

  Dim InxW As Long

  For InxW = 1 To Worksheets.Count
    Debug.Print Worksheets(InxW).Name
    If InxW Mod 100 = 0 Then
      Debug.Assert False
      Debug.print "-----------------"
    End If
  Next

End Sub

每当 InxW 是 100 的倍数时,就会到达 Debug.Assert False 语句并停止执行。这将允许您检查列出的最后 100 个工作表。

工作表是否按您想要的顺序列出?

Option Explicit
Sub Try3()

  Dim InxW As Long
  Dim WshtName As String

  For InxW = 3 To 1 Step -1
    WshtName = "Sheet" & InxW
    Debug.Print Worksheets(WshtName).Name
    If InxW Mod 100 = 0 Then
      Debug.Assert False
      Debug.Print "-----------------"
    End If
  Next

End Sub

您可以按名称和索引访问工作表。如果您的工作表被命名为“Sheet1”到“Sheet344”,则此宏会以相反的顺序显示名称。

当我到达这一点时,你已经告诉 Fabricator 你想使用地区代码。根据维基百科,美国每个州都有不同数量的地区。如果工作表不是您想要的顺序,则必须生成名称。以下可能是最简单的方法:

Option Explicit
Sub Try5()

  Dim InxDist As Long
  Dim InxState As Long
  Dim NumDist As Long
  Dim StateDtl() As Variant
  Dim StateDtlPart() As String

  StateDtl = Array("Alabama|AL|7", "Alaska|AK|1", "Arizona|AZ|9", "Arkansas|AR|4")

  NumDist = 0
  For InxState = LBound(StateDtl) To UBound(StateDtl)
    StateDtlPart = Split(StateDtl(InxState), "|")
    Debug.Print StateDtlPart(0)
    For InxDist = 1 To Val(StateDtlPart(2))
      Debug.Print "  " & StateDtlPart(1) & Right("0" & InxDist, 2)
      NumDist = NumDist + 1
      If NumDist Mod 100 = 0 Then
        Debug.Assert False
        Debug.Print "-----------------"
      End If
    Next
  Next

End Sub

这里我介绍了两个数组。如果你不知道数组是什么,请查一下。

StateDtl = Array("Alabama|AL|7", "Alaska|AK|1", "Arizona|AZ|9", "Arkansas|AR|4") 将 StateDtl 初始化为:

StateDtl(0) = "Alabama|AL|7"
StateDtl(1) = "Alaska|AK|1"
StateDtl(2) = "Arizona|AZ|9"
StateDtl(3) = "Arkansas|AR|4"

如果您喜欢这种方法,则需要为每个州添加这样的字符串。

StateDtl 中的每个条目都包含三个部分:州名、州代码和区数。我不知道我的来源是否可靠所以不知道我显示的地区数量是否正确。

StateDtlPart = Split(StateDtl(InxState), "|") 将 StateDtl 中的条目拆分为多个部分:

StateDtlPart(0) = Alabama
StateDtlPart(1) = AL
StateDtlPart(2) = 7

这个宏生成一个类似的列表:

Alabama
  AL01
  AL02
  AL03
  AL04
  AL05
  AL06
  AL07
Alaska
  AK01
Arizona
  AZ01
  AZ02
  AZ03
  AZ04
  AZ05
  AZ06
  AZ07
  AZ08
  AZ09
Arkansas
  AR01
  AR02
  AR03
  AR04

等等。

您可能更喜欢 Fabricator 的方法,但如果这看起来很有趣,我明天会添加更多细节。

【讨论】:

  • 感谢您和 Fabricator 的有益建议。制造商工作,但我的目标是学习 VBA。我已经开始了基本教程,但这是需要完成的项目的一部分。我很抱歉把这个贴在不正确的地方。我会玩弄你的代码,看看我能从哪里得到。如果它似乎没有点击,我将采取自学路线并从那里开始。
  • @user3786642 您没有发错地方;你在一个问题上要求太多了。第一个问题是如何按要求的顺序访问 344 个工作表。您将如何尝试满足该要求?我已经向您展示了访问工作表的各种技术。我已经展示了一种按顺序生成工作表名称的技术。这有上诉吗?我还有一个想法?你想了解详情吗?您是否有自己的想法无法实施?试一试,然后将其作为问题发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多