VBA: Когда * можно использовать?
Я пытаюсь понять, когда я могу и не могу использовать *
обобщать при кодировании.
Пример того, что я имею в виду xfile.*
если расширение не имеет значения. Другой будет *.xls
если я хочу сослаться на любые файлы Excel.
Я не просто интересуюсь файлами, хотя. Я хочу использовать что-то вроде Washington*
а также Oregon*
если я хочу все листы в книге независимо от того, что будет дальше, будь то This Month
, This Year
, так далее.
Другим уровнем будут значения в ячейках электронной таблицы.
Я прошу каждого из них конкретно, потому что *
Кажется, к каждому сценарию относятся по-разному.
Спасибо за помощь.
РЕДАКТИРОВАТЬ:
Хорошим примером проблемы, с которой я только что столкнулся, является следующий код:
If ActiveSheet.Name <> "City*" Then
code
End If
Варианты имен рабочих листов: City MTD
, City YTD
, Country MTD
, а также Country YTD
(Месяц к дате и год к дате, к вашему сведению)
Лист, на котором я нахожусь City MTD
но моя программа все еще входит в If-Statement. Это заставляет меня верить, что *
не рассматривается как подстановочный знак, а как буквальная звездочка в строке.
2 ответа
Вот как бы вы использовали *
чтобы получить доступ ко всем листам, имена которых соответствуют определенному шаблону:
Sub test()
Dim ws As Worksheet
Dim count As Long
For Each ws In ActiveWorkbook.Sheets
If LCase(ws.Name) Like "*data*" Then count = count + 1
Next ws
Debug.Print "There are " & count & " sheets with 'data' in their name"
End Sub
Когда я запускаю это в книге, в которой есть 1 лист с именем "Необработанные данные" и другой "Обработанные данные" (и некоторые другие листы, которые нигде не содержат "данных"), я получаю:
There are 2 sheets with 'data' in their name
*
полезен для многих целей, но несколько ограничен. Для более сложных задач рекомендуется использовать объект регулярного выражения VBScript, который также можно использовать в VBA (если вы добавите правильную ссылку на проект).
Список методов, найденных для * подстановочного знака
,
Range .Replace Method: UsedRange.Replace "test*", "NewValue"
Range .AutoFilter: Range("A:A").AutoFilter Field:=1, Criteria1:="test*"
Like Operator (compares strings): If Range("A1") Like "test*" Then
Files and Folders Methods:
Copy
CopyFile
CopyFolder
MoveFile
MoveFolder
DeleteFolder
DeleteFile
Dir Function (searches for files or folders)
ChDir Statement (changes current folder)
Kill Statement (deletes files from disk)
Application Methods
.GetSaveAsFilename (used for file extension only)
.GetOpenFilename (used for file extension only)
.Match "test*", Range("A:A"), 0 '(If match_type is 0 and lookup_value is text)
WorksheetFunction Methods:
.AverageIf and .AverageIfs
.CountIf and .CountIfs
.Find and .FindB (Range("A1").Find "*")
.Match
.Search and .SearchB (locate one text string within a 2nd string)
.SumIf and .SumIfs
.VLookup and .HLookup
FileDialog Object - .InitialFileName Property
VBScript.RegExp (or reference to "Microsoft VBScript Regular Expressions *")
Scripting.FileSystemObject CopyFile and DeleteFile Methods ("Microsoft Scripting Runtime")
,
Его можно экранировать с помощью символа тильды (~): Range("A1").Find "~*"
находит * (.Find "~~"
находит ~)
,