В настоящее время я создаю макрос, с помощью которого могу перемещать данные из 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
@PeterT Я обнаружил, что при использовании формул в ячейке возникают ошибки: лучшее решение, которое я придумал, - использовать Format(Cell.value,Cell.NumberFormat)
@Sgdva В этом случае код будет Format(exWb.Sheets("Segment").Cells(7, 5),Cell.NumberFormat))
? Как я уже упоминал, я совсем новичок в VBA, поэтому не могу так легко следовать ему. Спасибо!
Мой плохой Эрик, ты на трассе! Это было бы так: Format(exWb.Sheets("Segment").Cells(7, 5).Value,exWb.Sheets("Segment").Cells(7, 5).NumberFormat))
Некоторым не нравится указывать свойство .Value
, но мне нравится. Возможно стоит отметить, что при замене в word мне нравится такой подход
Предположим, что число 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%.
Чтобы использовать отображаемое значение ячейки вместо основного числового значения, используйте
exWb.Sheets("Segment").Cells(7, 5).Text