Доброе утро! Начинаю освоение VBA для Excel. В общем, допиливаю макрос для автозаполнения (генерации) документов на базе FillDocuments под свои нужды.
Вкратце, как-то так:[vba]
Код
For i = 1 To КоличествоОбрабатываемыхСтолбцов FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
[/vba]В верхнем ряду таблицы пометки типа {Колонка}, под ними данные. Потом сами данные вносятся в шаблон Word и сохраняются в новой файле.
Все работает нормально, но есть проблема при экспорте данных в Word. Все числа переносятся без сохранения формата ячейки. То есть, в Excel "1 245 245,10", а в Ворде "1245245,1". Сначала сделал дополнительные столбец с формулой =ТЕКСТ([@Маса];"# ##0,00"), но такое решение, скорее, "костыль". Потом в самом VBA задал для "маску" формата через Format(Expression, ), но в таком случае придется задавать формат и для других колонок или усложнять перебор элементов таблицы дополнительным условием в цикле.
Подскажите, пожалуйста, как можно сделать это более элегантно, что ли? То есть, чтобы формат ячеек в xls точь в точь передавался в другие приложения без шаманства. И желательно, чтобы решение было более-менее "устойчиво" для запуска другими пользователями. С форматом даты проблема аналогичная.
Заранее спасибо!
Доброе утро! Начинаю освоение VBA для Excel. В общем, допиливаю макрос для автозаполнения (генерации) документов на базе FillDocuments под свои нужды.
Вкратце, как-то так:[vba]
Код
For i = 1 To КоличествоОбрабатываемыхСтолбцов FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i))
[/vba]В верхнем ряду таблицы пометки типа {Колонка}, под ними данные. Потом сами данные вносятся в шаблон Word и сохраняются в новой файле.
Все работает нормально, но есть проблема при экспорте данных в Word. Все числа переносятся без сохранения формата ячейки. То есть, в Excel "1 245 245,10", а в Ворде "1245245,1". Сначала сделал дополнительные столбец с формулой =ТЕКСТ([@Маса];"# ##0,00"), но такое решение, скорее, "костыль". Потом в самом VBA задал для "маску" формата через Format(Expression, ), но в таком случае придется задавать формат и для других колонок или усложнять перебор элементов таблицы дополнительным условием в цикле.
Подскажите, пожалуйста, как можно сделать это более элегантно, что ли? То есть, чтобы формат ячеек в xls точь в точь передавался в другие приложения без шаманства. И желательно, чтобы решение было более-менее "устойчиво" для запуска другими пользователями. С форматом даты проблема аналогичная.
[/vba] значение будет взято из свойства по умолчанию Cells(1, 1).Value поэтому в переменную будет помещено "1245245,1", а если нужно помещать значение с учетом формата ячейки, то берите его из свойства Cells(1, 1).Text.
Добрый вечер! Когда вы пишите: [vba]
Код
s$ = Cells(1, 1)
[/vba] значение будет взято из свойства по умолчанию Cells(1, 1).Value поэтому в переменную будет помещено "1245245,1", а если нужно помещать значение с учетом формата ячейки, то берите его из свойства Cells(1, 1).Text.KSV
Еще один трабл с той же прогой, но уже с экспортом не в Ворд, а в Эксель. В общем, попробовал дописать по аналогии код, чтобы помимо актов (Ворд), параллельно генерировались еще и ТТН (в формате Excel). Но вот такая проблема: после запуска макроса он делает замены в Ворде (отлично), делает замены в шаблоне Эксель (отлично), но при каждом не найденном элементе выдает предупреждение типа: "Мы не нашли ничего, что нужно заменить. Попробуйте ..." Насколько я понял, нужно добавить условие проверки с .find где-то перед .replace
Если можете, подскажите, пожалуйста, где я упускаю что-то важное. Этот цикл If Not ... is Nothing Then уже и туда, и сюда пытался прицепить. Может с ним что-то не так? Или я не в том порядке вызываю создание нового файла Эксель? Или что-то не так с переменной mycell? Почему она в любом случае is Nothing?
P.S. На данный момент там два отдельных цикла одинаковых, потом когда пойму, в чем дело, постараюсь их объединить уже нормально. Ниже полный код (сырой):
Еще один трабл с той же прогой, но уже с экспортом не в Ворд, а в Эксель. В общем, попробовал дописать по аналогии код, чтобы помимо актов (Ворд), параллельно генерировались еще и ТТН (в формате Excel). Но вот такая проблема: после запуска макроса он делает замены в Ворде (отлично), делает замены в шаблоне Эксель (отлично), но при каждом не найденном элементе выдает предупреждение типа: "Мы не нашли ничего, что нужно заменить. Попробуйте ..." Насколько я понял, нужно добавить условие проверки с .find где-то перед .replace
Если можете, подскажите, пожалуйста, где я упускаю что-то важное. Этот цикл If Not ... is Nothing Then уже и туда, и сюда пытался прицепить. Может с ним что-то не так? Или я не в том порядке вызываю создание нового файла Эксель? Или что-то не так с переменной mycell? Почему она в любом случае is Nothing?
P.S. На данный момент там два отдельных цикла одинаковых, потом когда пойму, в чем дело, постараюсь их объединить уже нормально. Ниже полный код (сырой):Невилл
Set EA = CreateObject("Excel.Application") Set ED = EA.Workbooks.Add
For Each row In ActiveSheet.Rows("3:" & r) With row ФИО = "ТТН" & "-" & Trim$(.Cells(1)) & " " & Trim$(.Cells(3)) Filename = НоваяПапка & ФИО & РасширениеСоздаваемыхФайловТТН Set ED = EA.Workbooks.Add(ПутьШаблонаТТН): DoEvents For i = 1 To КоличествоОбрабатываемыхСтолбцов FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i)) With ED.Worksheets(1).Range("A1:O78").Cells
If (myCell Is Nothing) Then '(вот тут по логике нужно NOT перед mycell, но тогда программа не срабатівает - не заменяется ничего, хотя файлы Эксель создаются) .Replace What:=FindText, Replacement:=ReplaceText, LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End If End With DoEvents
Next i ED.SaveAs Filename: ED.Close False: DoEvents
End With Next row EA.Quit msg = "Сформировано " & rc & " актов. Все они находятся в папке" & vbNewLine & НоваяПапка MsgBox msg, vbInformation, "Готово" End Sub
[/vba]
P.S Извините, что в той же теме другой вопрос задаю. Поздно вспомнил, про правило №4
Set EA = CreateObject("Excel.Application") Set ED = EA.Workbooks.Add
For Each row In ActiveSheet.Rows("3:" & r) With row ФИО = "ТТН" & "-" & Trim$(.Cells(1)) & " " & Trim$(.Cells(3)) Filename = НоваяПапка & ФИО & РасширениеСоздаваемыхФайловТТН Set ED = EA.Workbooks.Add(ПутьШаблонаТТН): DoEvents For i = 1 To КоличествоОбрабатываемыхСтолбцов FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i)) With ED.Worksheets(1).Range("A1:O78").Cells
If (myCell Is Nothing) Then '(вот тут по логике нужно NOT перед mycell, но тогда программа не срабатівает - не заменяется ничего, хотя файлы Эксель создаются) .Replace What:=FindText, Replacement:=ReplaceText, LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False End If End With DoEvents
Next i ED.SaveAs Filename: ED.Close False: DoEvents
End With Next row EA.Quit msg = "Сформировано " & rc & " актов. Все они находятся в папке" & vbNewLine & НоваяПапка MsgBox msg, vbInformation, "Готово" End Sub
[/vba]
P.S Извините, что в той же теме другой вопрос задаю. Поздно вспомнил, про правило №4 Невилл
Сообщение отредактировал Невилл - Пятница, 16.10.2015, 07:17
[/vba] ищет и заменяет текст в диапазоне A1:O78 на первом листе новой книги, созданной на шаблоне ПутьШаблонаТТН.
Попробуйте
[vba]
Код
Sub СформироватьДокументы() Dim ПутьШаблона$, ПутьШаблонаТТН$, НоваяПапка$, Filename$, ФИО$, FindText$, ReplaceText$, msg$, i&, Row As Range, myCell As Range
Set EA = CreateObject("Excel.Application") 'Set ED = EA.Workbooks.Add ' для чего здесь создается новая книга, если она нигде не используется?
For Each Row In ActiveSheet.Rows("3:" & r) With Row ФИО = "ТТН" & "-" & Trim$(.Cells(1)) & " " & Trim$(.Cells(3)) Filename = НоваяПапка & ФИО & РасширениеСоздаваемыхФайловТТН Set ED = EA.Workbooks.Add(ПутьШаблонаТТН): DoEvents For i = 1 To КоличествоОбрабатываемыхСтолбцов FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i)) With ED.Worksheets(1).Range("A1:O78").Cells
Set myCell = .Find(What:=FindText, LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
If Not (myCell Is Nothing) Then .Replace What:=FindText, Replacement:=ReplaceText, LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End If End With DoEvents Next i ED.SaveAs Filename: ED.Close False: DoEvents End With Next Row EA.Quit msg = "Сформировано " & rc & " актов. Все они находятся в папке" & vbNewLine & НоваяПапка MsgBox msg, vbInformation, "Готово" End Sub
[/vba]
если не получится — приложите файл-пример и шаблон ТТН.
[/vba] ищет и заменяет текст в диапазоне A1:O78 на первом листе новой книги, созданной на шаблоне ПутьШаблонаТТН.
Попробуйте
[vba]
Код
Sub СформироватьДокументы() Dim ПутьШаблона$, ПутьШаблонаТТН$, НоваяПапка$, Filename$, ФИО$, FindText$, ReplaceText$, msg$, i&, Row As Range, myCell As Range
Set EA = CreateObject("Excel.Application") 'Set ED = EA.Workbooks.Add ' для чего здесь создается новая книга, если она нигде не используется?
For Each Row In ActiveSheet.Rows("3:" & r) With Row ФИО = "ТТН" & "-" & Trim$(.Cells(1)) & " " & Trim$(.Cells(3)) Filename = НоваяПапка & ФИО & РасширениеСоздаваемыхФайловТТН Set ED = EA.Workbooks.Add(ПутьШаблонаТТН): DoEvents For i = 1 To КоличествоОбрабатываемыхСтолбцов FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i)) With ED.Worksheets(1).Range("A1:O78").Cells
Set myCell = .Find(What:=FindText, LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
If Not (myCell Is Nothing) Then .Replace What:=FindText, Replacement:=ReplaceText, LookAt:=xlPart, _ SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False End If End With DoEvents Next i ED.SaveAs Filename: ED.Close False: DoEvents End With Next Row EA.Quit msg = "Сформировано " & rc & " актов. Все они находятся в папке" & vbNewLine & НоваяПапка MsgBox msg, vbInformation, "Готово" End Sub
[/vba]
если не получится — приложите файл-пример и шаблон ТТН.KSV