从数组中提取工作表名称

时间:2016-05-16 19:42:41

标签: arrays excel vba dynamic

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

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

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

2 个答案:

答案 0 :(得分:3)

正如我在评论中提到的,有一种更好的方法来存储工作表名称和打印区域。它被称为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, "")

答案 1 :(得分:0)

只需扩展您的方法并使用2D阵列。

哪个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