Канал данных Excel XML, выводящий данные строки из строки

У меня есть XML-канал, который рисует список адресов электронной почты, отсортированных в алфавитном порядке в Листе 1

В листе 2 у меня есть список адресов электронной почты в столбце 1, а затем несколько других столбцов с информацией о пользователе.

Когда я обновляю данные и добавляется новое письмо, список адресов электронной почты в столбце 1 смещается вниз, поэтому данные в других столбцах не соответствуют. В любом случае я могу вставить новую строку и сдвинуть все данные во всех столбцах, если и когда новый адрес добавляется в столбец 1. Аналогичным образом удалите строку данных, если электронное письмо удалено из фида.

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

Заранее спасибо!

Прежде всего, поскольку отсутствует информация, я возьму на себя сценарий для работы и попытаюсь достичь того, что вам нужно. Возможно, вам придется немного изменить код, чтобы он соответствовал вашим потребностям, но это дает вам базу для работы.

Поскольку ваш XML-канал не содержит дополнительных данных, таблица, содержащая адреса электронной почты, не будет добавлять строки в остальную часть таблицы, как вы хотите. Мое предложение состоит в том, что вы используете код vba для выполнения этой работы.

Предполагая, что у вас есть следующий xml-файл:

<?xml version="1.0" encoding="UTF-8"?> <Email> <address>[email protected]</address> <address>[email protected]</address> <address>[email protected]</address> <address>[email protected]</address> <address>[email protected]</address> <address>[email protected]</address> </Email> 

Используя следующий код, вы создадите таблицу на листе:

 Const xmlFileUrl As String = "c:\filePath\note.xml" Sub ClearXmlMaps() Dim existingXmlMap As XmlMap For Each existingXmlMap In ActiveWorkbook.XmlMaps existingXmlMap.Delete Next existingXmlMap End Sub Sub CreateMailList() Dim xmlTable As XmlMap ClearXmlMaps Application.WindowState = xlNormal ActiveWorkbook.XmlImport URL:=xmlFileUrl, ImportMap:=Nothing, Overwrite:=True, Destination:=Range("$A$1") Set xmlTable = ActiveWorkbook.XmlMaps(1) xmlTable.Name = "EmailList" End Sub 

Код генерировал красную квадратную часть таблицы ниже:

XMLTable

И я добавил новый столбец под названием «Имя». Теперь предположим, что я хочу обновить свой XML-поток без очистки всей информации о имени столбца. Для этого я буду использовать вспомогательный лист (мой основной лист здесь – это «Данные», а вспомогательный – лист «Aux»), чтобы скопировать все данные, обновить фид и, наконец, пополнить мой стол последним состоянием, используя команда VLOOKUP, например, ниже:

 Sub RefreshEmailList() Dim existingXmlMap As XmlMap Dim dataSheet As Worksheet Dim auxSheet As Worksheet Set dataSheet = ThisWorkbook.Worksheets("Data") Set auxSheet = ThisWorkbook.Worksheets("Aux") dataSheet.Cells.Copy auxSheet.Cells(1, 1) auxSheet.Range(auxSheet.Cells(1, 1), auxSheet.Cells(auxSheet.Cells(auxSheet.Rows.Count, 1).End(xlUp).Row, auxSheet.Cells(1, auxSheet.Columns.Count).End(xlToLeft).Column)).Value = auxSheet.Range(auxSheet.Cells(1, 1), auxSheet.Cells(auxSheet.Cells(auxSheet.Rows.Count, 1).End(xlUp).Row, auxSheet.Cells(1, auxSheet.Columns.Count).End(xlToLeft).Column)).Value dataSheet.Range(dataSheet.Cells(2, 2), dataSheet.Cells(dataSheet.Cells(dataSheet.Rows.Count, 1).End(xlUp).Row, dataSheet.Cells(1, dataSheet.Columns.Count).End(xlToLeft).Column)).Clear For Each existingXmlMap In ThisWorkbook.XmlMaps If existingXmlMap.Name = "EmailList" Then ActiveWorkbook.XmlMaps("EmailList").DataBinding.Refresh End If Next existingXmlMap dataSheet.Range(dataSheet.Cells(2, 2), dataSheet.Cells(dataSheet.Cells(dataSheet.Rows.Count, 1).End(xlUp).Row, dataSheet.Cells(1, dataSheet.Columns.Count).End(xlToLeft).Column)).FormulaR1C1 = "=IFERROR(IF(VLOOKUP([@address],Aux!C1:C,COLUMN(),FALSE) = 0 , """", VLOOKUP([@address],Aux!C1:C,COLUMN(),FALSE)), """")" dataSheet.Range(dataSheet.Cells(2, 2), dataSheet.Cells(dataSheet.Cells(dataSheet.Rows.Count, 1).End(xlUp).Row, dataSheet.Cells(1, dataSheet.Columns.Count).End(xlToLeft).Column)).Value = dataSheet.Range(dataSheet.Cells(2, 2), dataSheet.Cells(dataSheet.Cells(dataSheet.Rows.Count, 1).End(xlUp).Row, dataSheet.Cells(1, dataSheet.Columns.Count).End(xlToLeft).Column)).Value End Sub 

Если вы измените файл xml на следующее:

 <?xml version="1.0" encoding="UTF-8"?> <Email> <address>[email protected]</address> <address>[email protected]</address> <address>[email protected]</address> <address>[email protected]</address> <address>[email protected]</address> <address>[email protected]</address> <address>[email protected]</address> </Email> 

А затем запустите подпрограмму RefreshEmailList (), вы получите результат ниже:

FinalXmlFeedResult

Решение выше работает для добавления или удаления строк, но вы должны знать о двух вещах:

  • Обновление XML-канала с помощью кнопки обновления не приведет к событию
  • Это решение не сохраняет старые состояния, а это означает, что если одно электронное письмо удаляется и затем снова добавляется, информация об этом пользователе может быть потеряна.

Вместо автоматического обновления столбца вы можете поместить входящие данные в «зону ожидания» (либо отдельную рабочую таблицу, либо массив, в зависимости от того, с чем вам удобнее).

Затем вы можете сравнить два списка, чтобы проверить новые адреса электронной почты (добавить их в конец существующих данных) или адреса электронной почты, которые больше не существуют во входящих данных (удалите строки из существующих данных).

Чтобы вставить новую строку (и сдвинуть каждый столбец вниз), вы можете использовать этот код VBA:

 ActiveCell.EntireRow.Insert xlShiftDown 

с ActiveCell – ячейкой (диапазоном) в строке, где должен появиться новый: если вам нужно добавить 5-ю пустую строку ActiveCell.Row должно быть = 5.

Для удаления всей строки код будет:

 ActiveCell.EntireRow.Delete xlShiftUp 

с ActiveCell, являющимся ячейкой (диапазоном) в строке для удаления

  • Экспорт в XML с использованием VBA - Коррекция заголовка
  • Экспорт XML с помощью кода Excel vba
  • Обновление / стирание данной строки в XML с помощью C #
  • Filemaker Pro и Import.IO. Как импортировать в FMP с помощью API Import.IO?
  • Разница скоростей между Linq и XML и Excel с OledbConnection?
  • Преобразование PDF в Base64 строковое представление, не открываемое при преобразовании назад
  • Ошибка при использовании Microsoft XML v3.0 или v6.0
  • Отсутствует ссылка Microsoft XML на macOS Sierra 10.12.1, Office Mac 2011 14.6.1
  • XSL для преобразования XML в Excel xls sheet
  • XLS в XML-макрос для Mac Excel
  • Как добавить XML-схему / файл дизайна в Excel Interop?
  • Interesting Posts

    Исключить выходные дни из динамического диапазона дат

    Портируйте расчет комиссионных ставок SUMPRODUCT с Excel на MYSQL

    Макрос VBA не может найти последнюю использованную ячейку с ActiveCell

    Сканировать все значения в столбце b1 листа и где каждое значение, найденное на листе 2, вставляет значение рядом с каждым сопоставленным значением?

    Excel – поиск и замена различных строк

    Получил странный результат в php-массиве excel upload

    Замедление временной шкалы в Pivot View

    Поиск n-го события в нескольких столбцах в Excel

    Групповые поля в диапазоны – Excel

    Обработка подстановочных знаков стандартными символами в формуле INDEX (MATCH (COUNTIF ()))

    VLOOKUP с алфавитно-цифровыми кодами Неудача, даже если они равны.

    Cells.Find () поднимает «Ошибка выполнения 91: переменная объекта или с блоком не установлена»

    Экспорт нескольких (конкретных) рабочих листов в CSV-файлы в указанном каталоге

    Использование функций рабочего листа в макросе

    Чистая и исправленная ячейка VBA, возвращающая #Value

    Давайте будем гением компьютера.