Уникальные значения узлов с использованием oXMLFile.SelectNodes

#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