Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сбивается формат данных при экспорте в Word - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Сбивается формат данных при экспорте в Word
Невилл Дата: Вторник, 13.10.2015, 10:24 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 79
Репутация: 2 ±
Замечаний: 0% ±

Excel 2007
Доброе утро! Начинаю освоение 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 точь в точь передавался в другие приложения без шаманства. И желательно, чтобы решение было более-менее "устойчиво" для запуска другими пользователями. С форматом даты проблема аналогичная.

Заранее спасибо!


Сообщение отредактировал Serge_007 - Вторник, 13.10.2015, 20:17
 
Ответить
СообщениеДоброе утро! Начинаю освоение 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 точь в точь передавался в другие приложения без шаманства. И желательно, чтобы решение было более-менее "устойчиво" для запуска другими пользователями. С форматом даты проблема аналогичная.

Заранее спасибо!

Автор - Невилл
Дата добавления - 13.10.2015 в 10:24
KSV Дата: Вторник, 13.10.2015, 20:10 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
Добрый вечер!
Когда вы пишите: [vba]
Код
    s$ = Cells(1, 1)
[/vba] значение будет взято из свойства по умолчанию Cells(1, 1).Value поэтому в переменную будет помещено "1245245,1", а если нужно помещать значение с учетом формата ячейки, то берите его из свойства Cells(1, 1).Text.


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
СообщениеДобрый вечер!
Когда вы пишите: [vba]
Код
    s$ = Cells(1, 1)
[/vba] значение будет взято из свойства по умолчанию Cells(1, 1).Value поэтому в переменную будет помещено "1245245,1", а если нужно помещать значение с учетом формата ячейки, то берите его из свойства Cells(1, 1).Text.

Автор - KSV
Дата добавления - 13.10.2015 в 20:10
Невилл Дата: Пятница, 16.10.2015, 07:10 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 79
Репутация: 2 ±
Замечаний: 0% ±

Excel 2007
Еще один трабл с той же прогой, но уже с экспортом не в Ворд, а в Эксель.
В общем, попробовал дописать по аналогии код, чтобы помимо актов (Ворд), параллельно генерировались еще и ТТН (в формате 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. На данный момент там два отдельных цикла одинаковых, потом когда пойму, в чем дело, постараюсь их объединить уже нормально.
Ниже полный код (сырой):

Автор - Невилл
Дата добавления - 16.10.2015 в 07:10
Невилл Дата: Пятница, 16.10.2015, 07:12 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 79
Репутация: 2 ±
Замечаний: 0% ±

Excel 2007
Кусок кода:
[vba]
Код
Sub СформироватьДокументы()
ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
ПутьШаблонаТТН = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблонаТТН)
НоваяПапка = NewFolderName & Application.PathSeparator

Dim EA As Object, ED As Object, ES As Object:

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 = Cells.Find(What:=FindText, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)

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]
Код
Sub СформироватьДокументы()
ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона)
ПутьШаблонаТТН = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблонаТТН)
НоваяПапка = NewFolderName & Application.PathSeparator

Dim EA As Object, ED As Object, ES As Object:

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 = Cells.Find(What:=FindText, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)

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:12
KSV Дата: Пятница, 16.10.2015, 18:33 | Сообщение № 5
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
Ошибка в коде в том, что [vba]
Код
                    Set myCell = Cells.Find(What:=FindText, After:=ActiveCell, LookIn:=xlFormulas, _
                        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
[/vba] ищет на активном листе активной книги,
а [vba]
Код
                With ED.Worksheets(1).Range("A1:O78").Cells

                        ...

                        .Replace What:=FindText, Replacement:=ReplaceText, LookAt:=xlPart, _
                            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
[/vba] ищет и заменяет текст в диапазоне A1:O78 на первом листе новой книги, созданной на шаблоне ПутьШаблонаТТН.

Попробуйте
если не получится — приложите файл-пример и шаблон ТТН.


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
СообщениеОшибка в коде в том, что [vba]
Код
                    Set myCell = Cells.Find(What:=FindText, After:=ActiveCell, LookIn:=xlFormulas, _
                        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
[/vba] ищет на активном листе активной книги,
а [vba]
Код
                With ED.Worksheets(1).Range("A1:O78").Cells

                        ...

                        .Replace What:=FindText, Replacement:=ReplaceText, LookAt:=xlPart, _
                            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
[/vba] ищет и заменяет текст в диапазоне A1:O78 на первом листе новой книги, созданной на шаблоне ПутьШаблонаТТН.

Попробуйте
если не получится — приложите файл-пример и шаблон ТТН.

Автор - KSV
Дата добавления - 16.10.2015 в 18:33
Невилл Дата: Пятница, 16.10.2015, 21:03 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 79
Репутация: 2 ±
Замечаний: 0% ±

Excel 2007
KSV, Получилось сразу! yes Не знаю, как и благодарить))
 
Ответить
СообщениеKSV, Получилось сразу! yes Не знаю, как и благодарить))

Автор - Невилл
Дата добавления - 16.10.2015 в 21:03
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!