String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true
Убедитесь, что вы понимаете, почему. Это потому, что сравнение ==
сравнивает только ссылки; equals()
метод сопоставляет содержимое по символу.
Когда вы вызываете new для a
и b
, каждый получает новую ссылку, указывающую на "foo"
в таблице строк. Ссылки разные, но контент один и тот же.
Комментарий в каждой ячейке заголовка ListObject
остается там, если столбец переименован или переставлен.
Если (!) вы можете скрыть все комментарии по Application.DisplayCommentIndicator = xlNoIndicator
(все комментарии не распознаются красным треугольником и не видны при наведении курсора), это может быть обходной путь:
Private Sub RecognizeColumnsOfListObject()
Dim lo As ListObject
Dim lc As ListColumn
For Each lo In ActiveSheet.ListObjects
For Each lc In lo.ListColumns
Debug.Print lc.Index ' not unique, always 1, 2, 3, ...
Debug.Print lc.Name ' not unique, changeable
If Not lc.Range.Cells(1).Comment Is Nothing Then
Debug.Print lc.Range.Cells(1).Comment.text ' unique
End If
Next lc
Next lo
End Sub
Если я присваиваю каждой ячейке заголовка a ListObject
имя, она перемещается вместе со столбцом, если я переставляю ListObject. Поскольку его Name.Value
или Name.RefersTo
начинается с =<ListObjectName>...
, я получаю абсолютный адрес следующим образом:
Dim n As Name
With <sheet_codename>
For Each n In .Names
Debug.Print .Range(Mid(n.RefersTo, 1)).Address
Next n
End With
При ближайшем рассмотрении, нет ничего плохого в создании заголовков таблиц Named Ranges. Это потому, что такие имена присваиваются структурированной ссылке, а не необработанному адресу ячейки, , поэтому они будут перемещаться вместе со столбцом!
С другой стороны, это имя не печатается в поле адреса (по крайней мере, в Office 2007) при выборе заголовка, что довольно неудобно (потому что я не могу быстро найти имя, которое я должен набрать в код, чтобы получить этот столбец).