2016-05-16 3 views
1

Я определил массив с двумя переменными: имя листа и pageetup.printarea.Извлечение имени листа из массива

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

Проблема состоит в том, что SheetName включает в себя число, которое не нужно (например, China2). Как я могу извлечь только строковую часть имени листа и printarea отдельно? Или, есть ли лучший способ установить это для начала? Благодарю.

+0

Да, есть лучше способ. Вы можете использовать класс 'Словарь', но вы должны предоставить более подробную информацию о своей проблеме. –

+0

Количество листов может варьироваться. Итак, я настроил массив для сбора необходимых мне данных: имя каждого листа и диапазоны печати, которые заданы на каждом листе. Названия листов (по какой-либо причине) содержат число. Например, одно имя листа - China2. Все, что мне нужно, это «Китай» и диапазон печати, но как две разные переменные. – ectrimm

ответ

0

Просто расширьте свой curent-подход и используйте 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 
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, "") 
+0

Извините, я относительно новичок в VBA, и раньше я не использовал класс Dictionary. Как только это будет установлено и запущено, как я могу извлечь имя и printarea для каждого листа из dic? Мне понадобится эта информация позже, поскольку мне нужно создать pdf-файл для каждого листа и сохранить его как имя его листа. – ectrimm

+0

Пожалуйста, внимательно прочитайте мой ответ. Там все, что вам нужно;) –

+1

Как будет '' \ d {1,} "' захватить 'Китай'? –

Смежные вопросы