Вызов имен листов VBAProject в макросе

Фон:

Я пытаюсь добавить гиперссылки в список ячеек непосредственно на соответствующие им имена листов, где значения ячеек были зафиксированы в словаре. Это не одинаковые имена, поскольку я заменил пробелы и специальные символы.

Проблема:

Я заметил, что мои листы в VBAProject назывались Sheet2 как cells(2,1), поэтому попытался выполнить быстрый цикл для ввода гиперссылок. К сожалению, я обнаружил, что for i = 2 to 26 // sheets(i).name не оправдал моих ожиданий (отображалась гиперссылка cells(2,1)sheet25).

Расследование:

Как мне вызвать имя листа VBAProject в моем макросе, чтобы получить точное совпадение?

Код:

    With Sheets("Overview")
        Dim i As Long:  For i = 2 To 26
            Dim ws As String:  ws = Sheets(i).Name
            .Hyperlinks.Add Anchor:=.Cells(i, 1), Address: = "", SubAddress:=ws & "!A1", TextToDisplay:=.Cells(i, 1).Value
        Next i
    End With
Sheets("Sheet" & i)
Warcupine 08.08.2024 21:20

Разве гиперссылка не должна использовать имя листа, а не его кодовое имя? Например, если я изменю кодовое имя на Foo, а затем попытаюсь добавить гиперссылку с помощью SubAddress: = "Foo!A1", я получу сообщение «Ссылка недействительна». ошибка при нажатии на полученную гиперссылку. Я изо всех сил пытаюсь понять, какое отношение здесь имеет кодовое имя, если предположить, что вы имеете в виду именно это.

BigBen 08.08.2024 21:21
SubAddress:= "'" & ws & "'!A1"
Spectral Instance 08.08.2024 21:35

@BigBen proporties("name") is relevent as the sheets were created in the order of the cells, so cells(i,1).value` похож на листы("лист" & i).name. The problem is looping by sheet goes from the first displayed sheet to last displayed sheet, which is why листы(i) =/= листы("лист" & i)... to look at Workcupine's response, i am using that nomenclature for this response, but in trying that in my cope I get 'subscript out of range когда я пытаюсь sheets("sheet" & i)

Cyril 09.08.2024 21:39

Что помогло мне решить эту проблему, так это взять код /u/VBasic2008 и изменить его, добавив If InStr(1,Sheets(j).name,Split(.cells(i,1).value," ")(0)) then, потому что Those are not like-for-like names as I have replaced spaces and special character... второй цикл по листам.

Cyril 09.08.2024 21:44

Суммативное утверждение... Обрабатывать результаты других людей неприятно, когда вы не можете увидеть, как они их сделали (пытаясь найти, какие специальные символы с чем воспроизводятся). Я очень ценю тех, кто попытался ответить и направил меня на правильный путь.

Cyril 09.08.2024 21:46
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
6
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это, если это подходит для ваших нужд. Не стесняйтесь меняться.

Sub Test()
Dim ws As Worksheet, sht As Worksheet

Set sht = Sheets("Overview")         'first worksheet

For Each ws In ThisWorkbook.Sheets   'iterate through all sheets
    If ws.Name <> sht.Name Then      'ignore the Overview sheet
        ws.Hyperlinks.Add Anchor:=sht.Cells(ws.Index, 1), _
            Address: = "", _
            SubAddress: = "'" & ws.Name & "'" & "!" & "A1", _
            TextToDisplay:=ws.Name
    End If
Next ws
End Sub

Это приводит к той же проблеме с выводом, что и код, который у меня был в посте, где VBProject.Properties("Name") = "Sheet2" не равно Sheets(2).

Cyril 09.08.2024 21:33
Ответ принят как подходящий

Создавайте гиперссылки с кодовыми именами

Sub CreateCodeNamedHyperlinks()

    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim sws As Worksheet: Set sws = wb.Sheets("Overview")
    Dim srg As Range:
    Set srg = sws.Range("A2", sws.Cells(sws.Rows.Count, "A").End(xlUp))
    srg.Hyperlinks.Delete  
        
    Dim scell As Range, dws As Worksheet, dwsCodeName As String
        
    For Each scell In srg.Cells
        
        dwsCodeName = CStr(scell.Value)
        
        On Error Resume Next
            Set dws = wb.Sheets(wb.VBProject.VBComponents(dwsCodeName) _
                .Properties("Name").Value)
        On Error GoTo 0
            
        If Not dws Is Nothing Then
            sws.Hyperlinks.Add Anchor:=scell, Address: = "", _
                SubAddress: = "'" & dws.Name & "'!A1", _
                TextToDisplay:=dwsCodeName
            Set dws = Nothing ' reset
        End If
        
    Next scell

End Sub

Это определенно помогло мне сориентироваться. Поскольку ни один из символов dwsCodeName не соответствует ячейкам (например, в именах листов удалены пробелы), я использовал InStr после разделения значения ячейки и сопоставления первого слова с именем каждого листа. Отмечу как ответ, хотя могу заявить, что dwsCodeName = CStr(scell.Value) во всех случаях неверно из-за этого утверждения в посте Those are not like-for-like names as I have replaced spaces and special characters.

Cyril 09.08.2024 21:31

Другие вопросы по теме