【问题标题】:Extracting the sheet name from an array从数组中提取工作表名称
【发布时间】:2016-09-12 17:16:07
【问题描述】:

我定义了一个包含两个变量的数组:工作表的名称和 pagesetup.printarea。

varArray(i) = ThisWorkbook.Sheets(i).Name & " " & Worksheets(i).PageSetup.PrintArea

问题是工作表名称包含一个我不需要的数字(例如,China2)。如何分别提取工作表名称和打印区域的字符串部分?或者,有没有更好的方法来设置它?谢谢。

【问题讨论】:

  • 是的,有更好的方法。您可以使用Dictionary 类,但您必须提供有关您的问题的更多详细信息。
  • 张数可以变化。因此,我设置了一个数组来捕获我需要的数据:每张纸的名称和在每张纸上设置的打印范围。工作表名称(无论出于何种原因)包含一个数字。例如,一个工作表名称是China2。我只需要“中国”和打印范围,但作为两个不同的变量。

标签: arrays excel vba dynamic


【解决方案1】:

正如我在评论中提到的,有一种更好的方法来存储工作表名称和打印区域。它被称为Dictionary。例如:

'needs reference to Microsoft Scripting Runtime
Dim dic As Dictionary

Set dic = New Dictionary
dic.Add "SheetName", "PrintArea"


'get print area for sheet
Dim sPrintArea As String
sPrintArea = dic("SheetName")

如您所见,现在您可以通过工作表名称访问打印区域;)

如果要枚举所有键和值,请使用for...each 循环:

Dim oKey As Variant
For Each oKey In dic.Keys
 MsgBox oKey & vbTab & dic(oKey)
Next

如果你只想得到China,你可以使用Regex within Excel

'needs reference to Microsoft VBScript Regular Expressions x.x
Dim oRegex As VBScript_RegExp_55.RegExp

Set oRegex = New VBScript_RegExp_55.RegExp

sPattern = "\d{1,}"
With oRegex
    .Pattern = sPattern
    .MultiLine = False
End With
sPureSheetName = oRegex.Replace(sSheetName, "")

【讨论】:

  • 抱歉,我对 VBA 比较陌生,之前没有使用过 Dictionary 类。设置并运行后,如何从 dic 中提取每张纸的名称和打印区域?稍后我将需要此信息,因为我需要为每个工作表创建一个 pdf 并将其保存为工作表名称。
  • 请仔细阅读我的回答。有你需要的一切;)
  • "\d{1,}" 将如何捕获China
  • 那么,我需要手动 dic.add 每个工作表名称和打印区域吗?通常有 20 多张。正如我所说,我对 VBA 比较陌生,只是不明白。
  • @MacroMan,此模式将捕获数字(一个或多个)。有必要从字符串中删除数字;)
【解决方案2】:

只需扩展您当前的方法并使用二维数组。

哪个 IMO 更适合字典,因为您可以根据需要扩展元素的数量,并且不存在使用字典(多次出现)的关键原因。

同样使用regexp进行清理,但取出所有数字。

Sub Test()
Dim x() As String
Dim ws As Worksheet
Dim lngCnt As Long

ReDim x(1 To ActiveWorkbook.Sheets.Count, 1 To 2)

For Each ws In ActiveWorkbook.Sheets
    lngCnt = lngCnt + 1
    x(lngCnt, 1) = CleanStr(ws.Name)
    x(lngCnt, 2) = ws.PageSetup.PrintArea
Next

End Sub

可选清洁功能

Function CleanStr(strIn As String) As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
   .Pattern = "\d+"
   .Global = True
   CleanStr = .Replace(strIn, vbNullString)
End With
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2019-01-17
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多