#excel #vba
#excel #vba
Вопрос:
Итак, я динамически генерирую имена своих листов, используя следующий код, путем чтения XML-файла:
Set GenreNodes = oXMLFile.SelectNodes("/catalog/query/genre/text()")
.
.
Private Sub CreateSheet(sheetName)
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets.Add(after:= _
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = sheetName
End Sub
Отлично работает при использовании XML без повторения похожих тегов жанра, таких как:
<?xml version="1.0"?>
<catalog>
<query id="bk101">
<question>Do we have cloud security</question>
<answer>Yes</answer>
<genre>Cloud</genre>
</query>
<query id="bk102">
<question>Do we have locks on the door</question>
<answer>No</answer>
<comment>We have fingerprint access.</comment>
<genre>Physical Security</genre>
</query>
</catalog>
Проблема в том, что в этом примере у меня есть повторы в genre (SDLC), например :
<?xml version="1.0"?>
<catalog>
<query id="bk101">
<question>Do we have cloud security</question>
<answer>Yes</answer>
<genre>Cloud</genre>
</query>
<query id="bk103">
<question>What SDLC Priciple is follwed?</question>
<answer>None</answer>
<comment>We have code ninjas.</comment>
<genre>SDLC</genre>
</query>
<query id="bk104">
<question>Do you have OSWP status?</question>
<answer>None</answer>
<comment>We plan to do next year.</comment>
<genre>SDLC</genre>
</query>
</catalog>
Excel выдает мне Name already exists
ошибку. Как мне извлечь уникальные имена узлов, чтобы у меня не было этой ошибки?
Спасибо.
Комментарии:
1. В вашем примере какое название листа вы бы использовали вместо SDLC?
2. Простым решением было бы: каждый раз, когда вы добавляете лист, добавляйте имя в
dictionary
. Затем, непосредственно перед попыткой добавления листа, проверьтеdictionary
имя и, если оно существует, не добавляйте его3. @Daniel На самом деле, у меня будут повторяющиеся жанры, поэтому делать их уникальными не имеет смысла.
4. Я думаю, нужно немного больше информации. можете ли вы использовать жанр только для названий листов? Вы хотите добавить все записи в виде таблиц или хотите избежать дубликатов? Нельзя ли просто добавить идентификатор запроса к жанру?
5. @Absinthe Я хочу избежать дубликатов и могу использовать только жанры в качестве названий листов.
Ответ №1:
Обновите код создания листа, чтобы он не пытался создавать дубликаты листов:
Private Sub CreateSheet(sheetName)
Dim ws As Worksheet
On Error Resume Next '<< ignore error if sheet doesn't exist
Set ws = ThisWorkbook.Sheets(sheetName)
On Error Goto 0 '<< stop ignoring errors
If ws Is Nothing Then
'sheet doesn't exist, so create it.
Set ws = ThisWorkbook.Sheets.Add(after:= _
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = sheetName
End If
End Sub