Word VBA: нужна помощь по параметрам Selection.Find.Text - в настоящее время вызывает бесконечный цикл

В настоящее время я создаю макрос, с помощью которого могу перемещать данные из Excel в таблицы Word. Мы хотим сохранить форматирование существующих таблиц Word и перемещать данные только в каждую ячейку. Используемые данные представлены в долларах (#,###), на акцию (#.##) и процентах (#.#%).

Моя проблема сейчас заключается в том, что в Excel это число может составлять 80,0%, но в Word оно отображается как 0,8, и когда я использую функцию .Text("[0-9].[0-9]"), оно переходит в бесконечный цикл. Мне нужно что-то, что либо выбирает только точные критерии (т. е. #.#), а не единицу больше, ИЛИ при расшифровке из Excel заставляет числа типа 80,0% отображаться как 0,80 или 80,0%.

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

Я видел что-то о регулярном выражении, которое потенциально может помочь со строгими критериями? С нетерпением жду ответа и узнаю больше о VBA, а пока я продолжу свои исследования. Спасибо!

Вот код:

Sub Seg1_QTD()  
Dim objExcel As New Excel.Application 
Dim exWb As Excel.Workbook 
Dim ExcelFileName As String 
Dim i As Integer   

ExcelFileName = "LocationHere" 
Set exWb = objExcel.Workbooks.Open("Excel.xlsm", ReadOnly:=True, CorruptLoad:=xlExtractData)  

'Change the # for ActiveDocument.Tables dependent on quarter 
If exWb.Sheets("READ ME").Range("B8") = "Q1" Then 
  i = 2 
Else 
  i = 3  
End If  

'There are other lines, I included one to simplify 
With ActiveDocument.Tables(i) .Cell(5, 3).Range.Text = exWb.Sheets("Segment").Cells(7, 5)  
End With  

exWb.Close SaveChanges:=False  
Set exWb = Nothing   
'===================FORMATTTING==================================  

Dim rngOriginal As Range 
Dim strTemp As String  

Application.ScreenUpdating = False   

'Set range of table 
Set rngOriginal = ActiveDocument.Range( \_ Start:=ActiveDocument.Tables(i).Cell(5, 3).Range.Start, \_ End:=ActiveDocument.Tables(i).Cell(23, 6).Range.End) 

rngOriginal.Select   
With Selection.Find 
.Wrap = wdFindStop 
.ClearFormatting 
.Text = "\[0-9\].\[0-9\]"  
.Replacement.Text = "" 
.Forward = True 
.Format = False 
.MatchCase = False 
.MatchWholeWord = False 
.MatchAllWordForms = False 
.MatchSoundsLike = False 
.MatchWildcards = False   

Do While .Execute 
strTemp = Val(Selection.Range) 
Selection.Range = Format((strTemp), "0.0%")  
Selection.Collapse wdCollapseEnd 
rngOriginal.Select 
Loop 
End With 

i = 0   

End Sub

Чтобы использовать отображаемое значение ячейки вместо основного числового значения, используйте exWb.Sheets("Segment").Cells(7, 5).Text

PeterT 31.05.2024 17:47

@PeterT Я обнаружил, что при использовании формул в ячейке возникают ошибки: лучшее решение, которое я придумал, - использовать Format(Cell.value,Cell.NumberFormat)

Sgdva 31.05.2024 18:04

@Sgdva В этом случае код будет Format(exWb.Sheets("Segment").Cells(7, 5),Cell.NumberFormat)) ? Как я уже упоминал, я совсем новичок в VBA, поэтому не могу так легко следовать ему. Спасибо!

Eric Gu 31.05.2024 19:07

Мой плохой Эрик, ты на трассе! Это было бы так: Format(exWb.Sheets("Segment").Cells(7, 5).Value,exWb.Sheets("Segment").Cells(7, 5).NumberFormat)) Некоторым не нравится указывать свойство .Value, но мне нравится. Возможно стоит отметить, что при замене в word мне нравится такой подход

Sgdva 31.05.2024 19:38
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
4
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предположим, что число 0,8 находится в ячейке внутри rngOriginal.

  • Найдите число, используя .Text = "[0-9].[0-9]", чтобы найти ячейку, содержащую 0,8. Затем обновите число с 0,8 до 80,0%. Первая итерация цикла успешна.
  • rngOriginal.Select изменяет объект Selection.
  • Во время следующего запуска Do While .Execute он ищет числа из beginning из rngOriginal.
  • Он находит 0.0 в 80,0%, ячейка обновляется с 80.0%% (0,0 => 0,0%) и продолжает поиск...
  • В результате получается бесконечный цикл.

  • Ниже приведен пример кода, позволяющий найти число и обновить его в процентах.
Option Explicit
Sub SearchPercent()
Dim rngOriginal As Range
Dim strTemp As String, iEnd As Long
'Set range of table
Set rngOriginal = ActiveDocument.Range( _
    Start:=ActiveDocument.Tables(1).Cell(5, 3).Range.Start, _
    End:=ActiveDocument.Tables(1).Cell(23, 6).Range.End)
    iEnd = rngOriginal.End
    With rngOriginal.Find
        .Wrap = wdFindStop
        .ClearFormatting
        .Text = "[0-9].[0-9]"
        .Replacement.Text = ""
        .Forward = True
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
        Do While .Execute
            If rngOriginal.Start > iEnd Then Exit Do
            strTemp = Val(rngOriginal.Text)
            rngOriginal.Text = Format((strTemp), "0.0%")
            rngOriginal.Collapse wdCollapseEnd
        Loop
    End With
End Sub

Спасибо за ответ. Когда я запускаю код, он просачивается в области за пределами таблицы. Например, под каждой таблицей мы напишем анализ, что, конечно же, означает, что мы будем писать его как 80,0%, а не 0,8. Код просачивается в раздел анализа и форматирует его как 8000,0%.

Eric Gu 31.05.2024 19:41

Другие вопросы по теме