Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как ускорить выполнение копирования таблиц Word в массив (VBA Excel).
 
 
Добрый день. Задачка такая - в папке находится несколько файлов rtf, в них, соответственно - таблицы. Есть желание данные из этих таблиц считать в массивы (чтоб в дальнейшем - вставлять на листы excel).
Вобщем, родилась у меня такая функция.. Входной параметр - одномерный строчный массив, первый элемент - путь к папке, последующие - имена файлов rtf. Вроде все работает, но - при больших объемах данных - медленно. 4 файла, в каждом по 5-6 таблиц, количество строк 500...1000, столбцов от 2 до 8 - читает минут 6. Есть ли методы ускорения процесса и оптимизации данной процедурки?
Код
 Function CheckRtfFilesForTables1(q1)
    Dim arr As Variant
    Dim tmp(1 To 4) As Variant
    Dim data() As Variant
    Dim i As Long, j As Long, k As Long
    Dim filePath As String
    Dim currentFile As String
    Dim wordApp As Object
    Dim doc As Object
    Dim tbl As Object
    Dim strpath As String
    Dim isFileOpen As Boolean
    Dim rData As Variant
    Dim cellData As String
    On Error Resume Next
    arr = q1
    ReDim data(1 To 1)
    strpath = arr(1)
    If Right(Replace(strpath, " ", ""), 1) <> "\" Then strpath = strpath & "\" 
    Set wordApp = CreateObject("Word.Application")
    For i = 2 To UBound(arr)
        currentFile = arr(i)
        filePath = strpath & currentFile     
        isFileOpen = False
        For j = 1 To wordApp.Documents.Count
            If wordApp.Documents(j).FullName = filePath Then
                Set doc = wordApp.Documents(j)
                isFileOpen = True
                Exit For
            End If
        Next j
        If Not isFileOpen Then
            Set doc = wordApp.Documents.Open(filePath, ReadOnly:=True)
        Else
            doc.Activate
        End If   
        For j = 1 To doc.Tables.Count
            Set tbl = doc.Tables(j)
            If Not tbl Is Nothing Then
                tmp(1) = tbl.cell(1, 1).Range.Text  
                tmp(1) = Left(tmp(1), Len(tmp(1)) - 2) 
                tmp(2) = tbl.Columns.Count          
                tmp(3) = tbl.Rows.Count             
                ReDim rData(1 To tmp(3), 1 To tmp(2))
                For k = 1 To tbl.Rows.Count
                    For m = 1 To tbl.Columns.Count
                        rData(k, m) = tbl.cell(k, m).Range.Text
                        rData(k, m) = Left(rData(k, m), Len(rData(k, m)) - 2) 
                        If Val(Replace(rData(k, m), ",", ".")) = rData(k, m) and rData(k, m)<>"" Then rData(k, m) = Val(Replace(rData(k, m), ",", "."))
                    Next m
                Next k
                tmp(4) = rData
                data(UBound(data)) = tmp
                ReDim Preserve data(1 To UBound(data) + 1)  
            End If
        Next j
   ReDim Preserve data(1 To UBound(data) - 1)
        If Not isFileOpen Then
            doc.Close False
        End If
    Next i
    CheckRtfFilesForTables1 = data
    wordApp.Quit
    Set wordApp = Nothing
End Function
Как последовательно вставить из Excel именованные диапазоны через буфер в файл Word?
 
Цитата
написал:
попробуйте что-то типа
Спасибо, сработало. "wdStory" пришлось поменять на 6,   и "Set shp = wdDoc.InlineShapes(wdDoc.InlineShapes.Count).ConvertToShape" с дальнейшим  "shp.Width = 400" убрать, ошибка вылазила),  получилось так:
Код
            wdApp.Selection.EndKey Unit:=6
            wdApp.Selection.Paste

Как последовательно вставить из Excel именованные диапазоны через буфер в файл Word?
 
Добрый день! Есть такой код, частично работающий:
Код
Sub CopyNamedRangeToWord()
    Dim nm As Name
    Dim rng As Range
    Dim wdApp As Object
    Dim wdDoc As Object
    Dim shp As Object

    ' Создаем новый экземпляр Word
    On Error Resume Next
    Set wdApp = GetObject(Class:="Word.Application")
    If Err.Number <> 0 Then
        Set wdApp = CreateObject("Word.Application")
    End If
    On Error GoTo 0
    
    wdApp.Visible = True
    Set wdDoc = wdApp.Documents.Add

    For Each nm In ThisWorkbook.Names
        If Left(nm.Name, 1) = "В" Then
            ' Добавляем новый лист, если это не первая вставка
            If wdDoc.Content.End <> 0 Then
                wdDoc.Words.Last.InsertBreak Type:=7 '
            End If
             wdApp.Selection.EndKey Unit:=6 '          
            Set rng = Range(nm.RefersTo)
            rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture         
            ' Вставляем картинку
            wdDoc.Content.Paste
            Set shp = wdDoc.InlineShapes(wdDoc.InlineShapes.Count).ConvertToShape
            
            ' Устанавливаем размер картинки, если нужно
            shp.LockAspectRatio = True
            shp.Width = 400 ' Измените размер по необходимости
            
            ' Добавляем подпись к рисунку
            wdDoc.Content.InsertAfter Text:="Подпись: " & nm.Name & vbCrLf
        End If
    Next nm
    Set shp = Nothing
    Set wdDoc = Nothing
    Set wdApp = Nothing
End Sub
Но после его работы остается только последняя вставка, остальные затираются. Как это подправить, не подскажете?
Можно ли при изменении текста закладок в документе Word и последующем обновлении полей блокировать всплывающие окна?, VBA Word отключить всплывающие окна при обновлении полей закладок.
 
Цитата
Да, возможно. Но я по ворду не особо специалист, просто в существующем шаблоне, под который попросили написать макрос, использовались именно закладки.
Изменено: AlexV1 - 30.04.2023 14:15:30
Можно ли при изменении текста закладок в документе Word и последующем обновлении полей блокировать всплывающие окна?, VBA Word отключить всплывающие окна при обновлении полей закладок.
 
Цитата
написал:
хм, а при этом в документе информация то обновляется?
А вот сам удивился, но да.
Можно ли при изменении текста закладок в документе Word и последующем обновлении полей блокировать всплывающие окна?, VBA Word отключить всплывающие окна при обновлении полей закладок.
 
Помогли с решением по первоначальному варианту, вместо  ActiveDocument.Fields.Update - исключаем при обновлении тип полей wdFieldAsk
Цитата
Код
Dim f As Field
    For Each f In ActiveDocument.Fields
        If f.Type <> wdFieldAsk Then
            f.Update
        End If
    Next f
Изменено: AlexV1 - 30.04.2023 11:06:19
Можно ли при изменении текста закладок в документе Word и последующем обновлении полей блокировать всплывающие окна?, VBA Word отключить всплывающие окна при обновлении полей закладок.
 
Цитата
написал:
Ну теме и правда тут не место ибо к Excel вопрос совсем не относится. Что касаемо проблемы, то скорее всего никак, ибо это не ошибка, не уведомление, а заложенное в обновление поля действие.  

Вопрос конретно касается закладок, но я б делал поле DocVariable  и типа так.
ActiveDocument.Variables("v_enterprise_name").Value = a_enterprise_name(Languge_ID)

В загашнике нашел, делал почти 20 лет назад :-)
О, спасибо! Пожалуй, и правда, вариант хороший!  
Можно ли при изменении текста закладок в документе Word и последующем обновлении полей блокировать всплывающие окна?, VBA Word отключить всплывающие окна при обновлении полей закладок.
 
Цитата
написал:
AlexV1, пример, в данном случае, не только код, но и файлы. Ну не мы же должны создавать макет для проверки.

Да, конечно, прикрепил файл в 1 сообщении.
Цитата
а почему это в теме по экселю

Ну, потому что здесь есть знатоки VBA, способные пройтись и экселем по ворду, и вордом по экселю. :D Вообще, потом, если получится задачка, думаю в эксель макрос перекинуть и через него запускать. Ну и, типа, необходимые данные из файла эксель подгружать.  
Можно ли при изменении текста закладок в документе Word и последующем обновлении полей блокировать всплывающие окна?, VBA Word отключить всплывающие окна при обновлении полей закладок.
 
Добрый день! Подскажите, макрос VBA меняет текст закладок в документе. Код такой, вроде по изменению текста закладок отрабатывает норм. Но - на ActiveDocument.Fields.Update начинать вылазить последовательно окна, подтверждающие новые значения. Можно ли как-то программно обновить поля, отключив эти окна?
Код
Private Sub CommandButton1_Click()
Dim i As Integer
For i = 0 To UBound(TxtBx_arr)
   Bmarks(i)(1) = TxtBx_arr(i).Value
   Call Bmarkschange(Bmarks(i)(0), Bmarks(i)(1))
Next i
Application.DisplayAlerts = wdAlertsNone
ActiveDocument.Fields.Update
Application.DisplayAlerts = wdAlertsAll
End Sub

Private Sub Bmarkschange(str1, str2)
Dim bmRng As Range
With ActiveDocument
 On Error Resume Next
 Set bmRng = .Bookmarks(str1).Range
  bmRng.Text = str2
  .Bookmarks.Add str1, bmRng
End With
End Sub
Изменено: AlexV1 - 29.04.2023 10:41:38
Из Excel в Word через Bookmarks, Оптимизация кода макроса
 
Цитата
написал:
ну поля и закладки как правило разные вещи. Без примера уверенности нет но
Код
    [URL=#]?[/URL]       1  2  3      application.DisplayAlerts=wdAlertsNone       application.DisplayAlerts=wdAlertsAll   
 
Увы, не помогло..
Из Excel в Word через Bookmarks, Оптимизация кода макроса
 
Цитата
Вы уверены что обновляются закладки, а не поля? Это совершенно другой вопрос и другая тема.


Ну да, сначала изменяется текст закладок, .затем надо обновить соответствующие поля. Вышеуказанная строка в коде вызывает последовательное появление окошек, аки при "ручном" нажатии "обновить поля" в документе, хотелось бы обойтись без них. : )
Изменено: AlexV1 - 28.04.2023 19:36:33
Из Excel в Word через Bookmarks, Оптимизация кода макроса
 
Подскажите, пожалуйста, а как / можно ли при изменении текста закладок в документе и последующем
Код
ActiveDocument.Fields.Update

избежать последовательного появления выпадающих окон с подтверждением нового значения текста закладок?
Изменено: AlexV1 - 28.04.2023 19:18:00
Как отсортировать элементы выпадающего списка по выбранному пользователем значению ячейки?
 
Цитата
МатросНаЗебре написал:
Сложно сказать на каком этапе ошибка. У меня эта формула работает.
А можно файл прикрепить, посмотреть? )
Как отсортировать элементы выпадающего списка по выбранному пользователем значению ячейки?
 
Цитата
МатросНаЗебре написал:
В дополнительный столбец вставить формулу массива:Код ? 1=ЕСЛИОШИБКА(СМЕЩ(Таблица1[[#Заголовки];[Столбец2]];НАИБОЛЬШИЙ(($A$2:$A$28=$E$2)*СТРОКА($A$2:$A$28);СЧЁТЕСЛИМН($A$2:$A$28;$E$2)+1-СТРОКА())-1;0);"")В столбце F проверку данных переслать на этот столбец.
Спасибо, МатросНаЗебре! Только где-то в формуле косяк..  
Как отсортировать элементы выпадающего списка по выбранному пользователем значению ячейки?
 
Добрый день. Имеются таблица с тремя столбцами, из которых формируется списки вводимых пользователем значений в трех ячейках (E2 F2, G2). Хотелось бы, во-первых, во всех списках исключить повторяющиеся значения. Во-вторых - формировать список для F2 исходя из выбора пользователем значения в E2, а в G2 - из F2 и E2 ( то есть если выбрано "А", то элементы списка в F2 должны включать только те строки, в которых в Столбец1 значение ячейки "A".  Ну а для G2 должен быть уже подбор элементов на соответствие по двум выбранным значениям в  E2 и F2 (то есть если пользователь выбрал в E2 "А", в F2 - "2222", то в списке для G2 должен остаться один элемент "шшш". Возможно ли решить такую задачку стандартными средствами excel  (тут несколько сомневаюсь) или с помощью VBA (тут по идее для специалистов проблем быть не должно)?
...А если количествох списков увеличить (каждый последующий зависит от выбора значений в предыдущих)?

 
Страницы: 1
Loading...