Фон:
Я пытаюсь добавить гиперссылки в список ячеек непосредственно на соответствующие им имена листов, где значения ячеек были зафиксированы в словаре. Это не одинаковые имена, поскольку я заменил пробелы и специальные символы.
Проблема:
Я заметил, что мои листы в 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
Разве гиперссылка не должна использовать имя листа, а не его кодовое имя? Например, если я изменю кодовое имя на Foo
, а затем попытаюсь добавить гиперссылку с помощью SubAddress: = "Foo!A1"
, я получу сообщение «Ссылка недействительна». ошибка при нажатии на полученную гиперссылку. Я изо всех сил пытаюсь понять, какое отношение здесь имеет кодовое имя, если предположить, что вы имеете в виду именно это.
SubAddress:= "'" & ws & "'!A1"
@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)
Что помогло мне решить эту проблему, так это взять код /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
... второй цикл по листам.
Суммативное утверждение... Обрабатывать результаты других людей неприятно, когда вы не можете увидеть, как они их сделали (пытаясь найти, какие специальные символы с чем воспроизводятся). Я очень ценю тех, кто попытался ответить и направил меня на правильный путь.
Попробуйте это, если это подходит для ваших нужд. Не стесняйтесь меняться.
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)
.
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
.
Sheets("Sheet" & i)