欢迎来到 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 的方法,但如果这看起来很有趣,我明天会添加更多细节。