Excel VBA относится к листу, который использует значок / эмодзи в качестве части имени - PullRequest
2 голосов
/ 12 октября 2019

Я использую 64-разрядный MSO для Office 365.

Я хочу написать макрос VBA, который выбирает различные листы в книге на основе имени листа.

Например,У меня есть две строки кода VBA, которые активируют рабочую книгу, а затем выбирают определенный лист в рабочей книге по имени листа.

Windows("myworkbook").Activate
Sheets("mysheet").Select

Однако мне приходится работать с некоторыми листами, которые содержат значки или смайлики вих. Например, есть лист с таким именем: «? Пациент».

Если я попытаюсь вставить значок / смайлик в VBA следующим образом: Sheets("? Patient").Select, значок не отображается в VBAредактор. Вместо этого я получаю Sheets("????? Patient").select.

Я также пытался использовать ChrW () для кодирования? символ скорой помощи (см. здесь: https://www.compart.com/en/unicode/U+1F691)

Когда я запускаю этот макрос ниже), я получаю invalid procedure call or argument, как указано ниже.

Sub SelectWeirdSheet()
Windows("MYWorkbook.xlsx").Activate
x = ChrW(128657) ' get invalid procedure call or argument here 
Sheets(x & " Patient").Activate
End Sub

Я также пробовал код для скорой помощи. .. также пытался ChrW(&H1F691), но я получаю ту же ошибку. Я подозреваю, что я использую неверный аргумент для ChrW () , но я потерян.

edit: Итак, в документах говорится, что мой аргумент для ChrW () не соответствуетассортимент. Это помогает объяснить ошибку, но я все еще пропускаю обходной путь.

Вопрос : Есть ли способ сослаться на использование VBA для выбора рабочих листов, которые имеют значок / эмодзи какчасть их имени?

Я знаю, что вы также можете ссылаться на листы по номеру индекса, как этот Sheets(3).Select. Тем не менее, будут случаи, когда я заранее не знаю индекс листа, но я буду знать имя листа, поэтому для меня лучше назвать листы по имени.

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 октября 2019

В дополнение к ответу с автоответчиком, при работе в отдельной книге , кодировщик может назначить CodeName для листа в IDE VBA, а затем использовать это CodeNameнепосредственно. Это действительно только в том случае, если Лист не воссоздан (то есть является постоянным листом в книге) на каком-либо этапе, потому что новый / скопированный лист автоматически получит новое CodeName в Excel.

ДляНапример, если дано CodeName shtPatient (см. рисунок ниже), код может быть:

Sub SelectWeirdSheet()
    ' Windows("MYWorkbook.xlsx").Activate '<-- this approach has limitations
    shtPatient.Activate ' See my comment below about the limitation - this will not work as expected in this example.
End Sub

Примечание: https://stackoverflow.com/a/10718179/9101981 объясняет, почему не следует использовать Activate, но я оставилкод как есть для целей этого ответа. Также посмотрите на Используя кодовое имя рабочего листа и избегая. Выберите & .Activate . Еще одно ограничение заключается в том, что CodeName действительно только для рабочей книги, в которой находится код, - поэтому в данном случае это может быть неприменимо.

Я выделил части CodeName среды IDE на изображении ниже, посмотрите, как«Тестовый пациент» не называется «Лист 7», но вместо этого имеет осмысленное имя, которое я дал ему в окне свойств ниже.

enter image description here

1 голос
/ 12 октября 2019

Чтобы правильно адресовать эмодзи, его следует разделить на два отдельных символа юникода. В этом случае это будет x = ChrW(&HD83D) & ChrW(&HDE91)

Эти два символа Юникода составляют эмодзи скорой помощи.

Итак, этот макрос теперь работает.

Sub SelectWeirdSheet()
    Windows("MYWorkbook.xlsx").Activate
    x = ChrW(&HD83D) & ChrW(&HDE91)
    Sheets(x & " Patient").Activate
End Sub

Найденрешение на реддит всех мест https://www.reddit.com/r/excel/comments/6pq1r1/vba_how_can_i_write_emojis_using_chrw/

...