将多个工作表中的相同范围的列复制到带有/不同列的摘要表中

时间:2014-06-28 20:31:43

标签: excel vba

如果已经发布,我很抱歉。我看起来无休止地找到了类似的主题,但不知道如何操作宏来满足我的需求。

我有344张数据。在每张纸中,我有一个特定的数据范围(AY125:AY158),我想将其复制到一张纸上。我想要的是将这些数据粘贴到摘要表中,其中表1的数据范围是A列,2表是B列,3表是C等。

我对VBA的了解非常简陋,所以对此的任何帮助都会很棒。

1 个答案:

答案 0 :(得分: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的方法,但如果这看起来很有趣,我明天会添加更多细节。