如果已经发布,我很抱歉。我看起来无休止地找到了类似的主题,但不知道如何操作宏来满足我的需求。
我有344张数据。在每张纸中,我有一个特定的数据范围(AY125:AY158),我想将其复制到一张纸上。我想要的是将这些数据粘贴到摘要表中,其中表1的数据范围是A列,2表是B列,3表是C等。
我对VBA的了解非常简陋,所以对此的任何帮助都会很棒。
答案 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的方法,但如果这看起来很有趣,我明天会添加更多细节。