VBA, чтобы посмотреть имена ячеек в столбце A, открыть файл на основе этого имени и скопировать только заголовки в столбце C:

Часто нам нужно изменить подстроку с несколькими ключевыми словами, разбросанными по строкам, предшествующим подстроке. Рассмотрим элемент xml:

<TASK>
  <UID>21</UID>
  <Name>Architectural design</Name>
  <PercentComplete>81</PercentComplete>
</TASK>

Предположим, мы хотим изменить 81, на какое-то другое значение, скажем 40. Сначала определите .UID.21..UID., затем пропустите все символы, включая \n до .PercentCompleted.. Шаблон регулярного выражения и спецификация замены:

String hw = new String("<TASK>\n  <UID>21</UID>\n  <Name>Architectural design</Name>\n  <PercentComplete>81</PercentComplete>\n</TASK>");
String pattern = new String ("(<UID>21</UID>)((.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
String replaceSpec = new String ("$1$2$440$6");
//note that the group (<PercentComplete>) is $4 and the group ((.|\n)*?) is $2.

String  iw = hw.replaceFirst(pattern, replaceSpec);
System.out.println(iw);

<TASK>
  <UID>21</UID>
  <Name>Architectural design</Name>
  <PercentComplete>40</PercentComplete>
</TASK>

Подгруппа (.|\n), вероятно, является отсутствующей группой $3. Если мы сделаем его не захватывающим с помощью (?:.|\n), то $3 будет (<PercentComplete>). Таким образом, шаблон и replaceSpec также могут быть:

pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
replaceSpec = new String("$1$2$340$5")

, и замена работает правильно, как и раньше.

-2
задан Ryan Shramo 13 July 2018 в 19:22
поделиться

1 ответ

Не проверено. Если значение вашей ячейки содержит только имя рабочей книги, вам нужно будет создать свою строку с тремя входами: Location, File Name и & amp; Тип файла. Вместе они составляют переменную sFile в приведенном ниже коде. Здесь только имя файла является динамическим (как определено значением в Col A).

Это зависит от всех ваших файлов, находящихся в одной папке. Откроется файл и скопируйте все заголовки (верхняя строка) и вставьте в поле Col B на вашем листе рядом с именем файла.

Вам нужно обновить sPath и указать листы ( здесь "Sheet" и "?"). У каждой книги есть то же имя листа, которое вы ищете? У каждой книги всего 1 лист? Просто то, что вам нужно будет учитывать.

Option Explicit

Sub Tester()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")

Dim sPath As String, sFile As String
Dim wb As Workbook
Dim Headers As Range

sPath = "E:\YourPath\....."

Dim MyFileRange As Range, MyFile As Range
Set MyFileRange = ws.Range("A2:A" & ws.Range("A" & ws.Rows.Count).End(xlUp).Row)

Application.DisplayAlerts = False
Application.ScreenUpdating = False
    For Each MyFile In MyFileRange
        sFile = sPath & MyFile.Text & ".xlsx"
        Set wb = Workbooks.Open(sFile)
            If Not wb Is Nothing Then
                Set Headers = wb.Sheets("?").Range("A1:A" & wb.Sheets("?").Cells(1, wb.Sheets("?").Columns.Count).End(xlToLeft).Column)
                Headers.Copy MyFile.Offset(, 1)
                wb.Close False
            Else
                MyFile.Offset(, 1) = "WORKBOOK NOT FOUND"
            End If
    Next MyFile
Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub

Изменено, чтобы обрабатывать ошибку в книге, которая не найдена. В этом случае вы увидите « WORKBOOK NOT FOUND » в Col B рядом с именем файла.

0
ответ дан urdearboy 17 August 2018 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: