Проблема с макросом Excel | |
---|---|
boba Автор Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
Есть некий многостраничный шаблон ексел, с которым мы работаем несколько лет
, выгребая данные из Оракл в Фокс, а оттуда в указанный шаблон ексел С этим не было и нет проблем Сторонняя фирма в своем продукте, который мы у них берем, среди прочего заполняет и такой же шаблон тоже Макрос ексела обращается напрямую к Оракл и все сам заполняет Проблема с колонками типа суммы Формат у них и в чистом шаблоне и в заполненном макросом стоит числовой, выравнивание по значению Тем не менее, после срабатывания макроса числовые колонки выглядят, выравненными слева, как чар поля, а не числовые, авто сумма на них не работает, дает ошибку, как если бы там было действительно чар поле Разделитель разрядов запятая в формате. Пробовали разные настройки на этот разделитель, результат одинаково неверный Если в Оракл Девелопер результат запроса из макрос положить в ексел, то там с колонками типа число все верно, те врет именно макрос Вот этот макрос Числовое поле , например, DMBTR Прикрепил экстракт из большого файла только на колонку сумма Автосумма дает 0 Sub ListMOVE() 'Onoaiiaea nayce n aacie If ConnectTure = 0 Then Call ConnectOracle End If 'Eeno aey auaiaa aaiiuo sListExcel = "Iinooieaiey" 'Ia?aaaaei Ia?aiao? Aaoa a aeiaaeuio? ia?aiaiio? dDateBeg = Workbooks(sWorkBookRun).Worksheets("Aeaaiay").Range("C4") dDateEnd = Workbooks(sWorkBookRun).Worksheets("Aeaaiay").Range("D4") Workbooks(sWorkBook).Activate StrSQL1 = "begin AST_REPORTFORGRINAT70.dDateRepE:=To_Date(" & ChrW(39) & dDateEnd & ChrW(39) & ",'dd.mm.yyyy'); end;" objDatabase.ExecuteSQL (StrSQL1) 'Auai? cai?ina ia iieo?aiea aaiiuo. Oaaeeoa Oaaeeoa ast_reportsql70 StrSQL1 = "select * from ast_reportsql70 where id=8001" Set OraDynaSet1 = objDatabase.DBCreateDynaset(StrSQL1, 0&) 'StrSQL = OraDynaSet1!sSql StrSQL = "select BUKRS, SCAPTION, SERNR, TXT100, SACC, SRBP, STYPELIZ, BUDAT, BWASL, VBUND, DMBTR, SDEBET, SCREDIT, SGTXT, BLDAT, XBLNR, SGROS, SERNUN, SACCOB " & _ "from Table(AST_ReportExpat30Afi.GetAst_TransferOrder30(To_Date(" & ChrW(39) & dDateBeg & ChrW(39) & ",'dd.mm.yyyy'), To_Date(" & ChrW(39) & dDateEnd & ChrW(39) & ",'dd.mm.yyyy" & ChrW(39) & ")))" Workbooks(sWorkBook).Worksheets(sListExcel).Activate StrBeg01 = 5 'I?enoea y?aae i = 0 sStrSheetBeg0 = "A" & Val(Str(StrBeg01 + i)) sStrSheetBeg4 = "B" & Val(Str(StrBeg01 + i)) sStrSheetBeg5 = "C" & Val(Str(StrBeg01 + i)) sStrSheetBeg1 = "E" & Val(Str(StrBeg01 + i)) sStrSheetBeg2 = "F" & Val(Str(StrBeg01 + i)) sStrSheetBeg3 = "D" & Val(Str(StrBeg01 + i)) sStrSheetBeg6 = "G" & Val(Str(StrBeg01 + i)) sStrSheetBeg7 = "J" & Val(Str(StrBeg01 + i)) sStrSheetBeg8 = "K" & Val(Str(StrBeg01 + i)) sStrSheetBeg9 = "L" & Val(Str(StrBeg01 + i)) sStrSheetBeg10 = "M" & Val(Str(StrBeg01 + i)) sStrSheetBeg11 = "N" & Val(Str(StrBeg01 + i)) sStrSheetBeg12 = "O" & Val(Str(StrBeg01 + i)) sStrSheetBeg13 = "P" & Val(Str(StrBeg01 + i)) sStrSheetBeg14 = "Q" & Val(Str(StrBeg01 + i)) sStrSheetBeg15 = "R" & Val(Str(StrBeg01 + i)) sStrSheetBeg16 = "S" & Val(Str(StrBeg01 + i)) sStrSheetBeg28 = "H" & Val(Str(StrBeg01 + i)) sStrSheetBeg29 = "I" & Val(Str(StrBeg01 + i)) While Not IsEmpty(Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg3).Value) Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg0).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg1).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg2).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg3).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg4).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg5).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg6).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg7).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg8).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg9).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg10).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg11).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg12).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg13).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg14).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg15).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg16).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg28).Value = "" Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBeg29).Value = "" sStrSheetBeg0 = "A" & Val(Str(StrBeg01 + i)) sStrSheetBeg4 = "B" & Val(Str(StrBeg01 + i)) sStrSheetBeg5 = "C" & Val(Str(StrBeg01 + i)) sStrSheetBeg1 = "E" & Val(Str(StrBeg01 + i)) sStrSheetBeg2 = "F" & Val(Str(StrBeg01 + i)) sStrSheetBeg3 = "D" & Val(Str(StrBeg01 + i)) sStrSheetBeg6 = "G" & Val(Str(StrBeg01 + i)) sStrSheetBeg7 = "J" & Val(Str(StrBeg01 + i)) sStrSheetBeg8 = "K" & Val(Str(StrBeg01 + i)) sStrSheetBeg9 = "L" & Val(Str(StrBeg01 + i)) sStrSheetBeg10 = "M" & Val(Str(StrBeg01 + i)) sStrSheetBeg11 = "N" & Val(Str(StrBeg01 + i)) sStrSheetBeg12 = "O" & Val(Str(StrBeg01 + i)) sStrSheetBeg13 = "P" & Val(Str(StrBeg01 + i)) sStrSheetBeg14 = "Q" & Val(Str(StrBeg01 + i)) sStrSheetBeg15 = "R" & Val(Str(StrBeg01 + i)) sStrSheetBeg16 = "S" & Val(Str(StrBeg01 + i)) sStrSheetBeg28 = "H" & Val(Str(StrBeg01 + i)) sStrSheetBeg29 = "I" & Val(Str(StrBeg01 + i)) i = i + 1 Wend i = 0 sStrSheetBegA = "A" & Val(Str(StrBeg01 + i)) sStrSheetBegB = "B" & Val(Str(StrBeg01 + i)) sStrSheetBegC = "C" & Val(Str(StrBeg01 + i)) sStrSheetBegD = "D" & Val(Str(StrBeg01 + i)) sStrSheetBegE = "E" & Val(Str(StrBeg01 + i)) sStrSheetBegF = "F" & Val(Str(StrBeg01 + i)) sStrSheetBegG = "G" & Val(Str(StrBeg01 + i)) sStrSheetBegH = "H" & Val(Str(StrBeg01 + i)) sStrSheetBegI = "I" & Val(Str(StrBeg01 + i)) sStrSheetBegJ = "J" & Val(Str(StrBeg01 + i)) sStrSheetBegK = "K" & Val(Str(StrBeg01 + i)) sStrSheetBegL = "L" & Val(Str(StrBeg01 + i)) sStrSheetBegM = "M" & Val(Str(StrBeg01 + i)) sStrSheetBegN = "N" & Val(Str(StrBeg01 + i)) sStrSheetBegO = "O" & Val(Str(StrBeg01 + i)) sStrSheetBegP = "P" & Val(Str(StrBeg01 + i)) sStrSheetBegQ = "Q" & Val(Str(StrBeg01 + i)) sStrSheetBegR = "R" & Val(Str(StrBeg01 + i)) sStrSheetBegS = "S" & Val(Str(StrBeg01 + i)) 'Auiieiaiea Cai?in ia iieo?aiea aaiiuo 'Workbooks(sWorkBook).Worksheets(sListExcel).Range("C" & Val(Str(StrBeg01 + i))).Value = StrSQL Set OraDynaSet = objDatabase.DBCreateDynaset(StrSQL, 0&) If OraDynaSet.RecordCount > 0 Then OraDynaSet.MoveFirst While OraDynaSet.EOF = 0 'Eoaa e ?oi auae?aai ec cai?ina Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegA).Value = OraDynaSet!BUKRS Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegB).Value = OraDynaSet!SCAPTION Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegC).Value = OraDynaSet!SERNR Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegD).Value = OraDynaSet!TXT100 Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegE).Value = OraDynaSet!SACC Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegF).Value = OraDynaSet!SRBP Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegG).Value = OraDynaSet!STYPELIZ Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegH).Value = OraDynaSet!BUDAT Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegI).Value = OraDynaSet!BWASL Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegJ).Value = OraDynaSet!VBUND Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegK).Value = OraDynaSet!DMBTR Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegL).Value = OraDynaSet!SDEBET Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegM).Value = OraDynaSet!SCREDIT Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegN).Value = OraDynaSet!SGTXT Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegO).Value = OraDynaSet!BLDAT Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegP).Value = OraDynaSet!XBLNR Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegQ).Value = OraDynaSet!SGROS Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegR).Value = OraDynaSet!SERNUN Workbooks(sWorkBook).Worksheets(sListExcel).Range(sStrSheetBegS).Value = OraDynaSet!SACCOB i = i + 1 sStrSheetBegA = "A" & Val(Str(StrBeg01 + i)) sStrSheetBegB = "B" & Val(Str(StrBeg01 + i)) sStrSheetBegC = "C" & Val(Str(StrBeg01 + i)) sStrSheetBegD = "D" & Val(Str(StrBeg01 + i)) sStrSheetBegE = "E" & Val(Str(StrBeg01 + i)) sStrSheetBegF = "F" & Val(Str(StrBeg01 + i)) sStrSheetBegG = "G" & Val(Str(StrBeg01 + i)) sStrSheetBegH = "H" & Val(Str(StrBeg01 + i)) sStrSheetBegI = "I" & Val(Str(StrBeg01 + i)) sStrSheetBegJ = "J" & Val(Str(StrBeg01 + i)) sStrSheetBegK = "K" & Val(Str(StrBeg01 + i)) sStrSheetBegL = "L" & Val(Str(StrBeg01 + i)) sStrSheetBegM = "M" & Val(Str(StrBeg01 + i)) sStrSheetBegN = "N" & Val(Str(StrBeg01 + i)) sStrSheetBegO = "O" & Val(Str(StrBeg01 + i)) sStrSheetBegP = "P" & Val(Str(StrBeg01 + i)) sStrSheetBegQ = "Q" & Val(Str(StrBeg01 + i)) sStrSheetBegR = "R" & Val(Str(StrBeg01 + i)) sStrSheetBegS = "S" & Val(Str(StrBeg01 + i)) OraDynaSet.dbmovenext Wend End If End Sub Исправлено 2 раз(а). Последнее : boba, 12.09.17 16:20 |
Re: Проблема с макросом Excel | |
---|---|
PaulWist Сообщений: 14601 Дата регистрации: 01.04.2004 |
Мне помогало выставлять формат в коде (макросе), типа
------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Проблема с макросом Excel | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Колонки точно числовые? Какой тип поля/свойства DMBTR в объекте, table которых возвращает функция AST_ReportExpat30Afi.GetAst_TransferOrder30?
Не работал с OO4O, но начал бы отладку с того, что посмотрел все свойства соответствующего объекта OraField. Т.е. Под отладчиком, или просто в какую свободную область листа кодом сбросил то что даёт OraDynaSet.Fields("DMBTR").OraIDataType OraDynaSet.Fields("DMBTR").Type Ну и собственно OraDynaSet.Fields("DMBTR").Value - это полный вариант вместо "сокращения" OraDynaSet!DMBTR Если константы подтвердят что в возвращаемом поле таки число а не строка (свойство Value это Variant - т.е. "значение любого типа", напрямую, как я понимаю, его тип не определить), ну тогда уж думать про обходные пути для запихивания таки "числового значения"... P.S. мануал тут - расшифровку констант там можно смотреть - проще чем в файлах установки oo4o... P.P.S. Все эти sStrSheetBegA = "A" & Val(Str(StrBeg01 + i)) наводят на очень грустные мысли по поводу компетентности авторов кода... ------------------ WBR, Igor |
Re: Проблема с макросом Excel | |
---|---|
boba Автор Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
Паша. Формат и так есть, вы ексел выбран тип -числа и именно такой формат.
Меняли еще раз и руками и кодом, дохлый номер. И выравнивание стоит по значению, если бы был тип число, выравнивание будет справа, а не слева. В прикрепленном ексел все это видно. |
Re: Проблема с макросом Excel | |
---|---|
boba Автор Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
Игорь, спасибо, я завтра попробую,
хотя у меня и нет файла с указанным макросом. Где-то в 98 -99 ом я таскал в фокс примерно таким кодом ( Оракл обжект фор оле) запросы , все было хорошо. Никаких замен типов не было. В самом Оракл тип поля точно numeric Это проверил в Oracle deleloper и в таблице, и в запросе. Но чем черт не шутит, может что-то "улучшили" Самое загадочное , вот что. Автор кода, ( он из той конторы уволился) использовал аналогичный подход для других видов шаблонов, в разы более сложных, и там все работает на ура. Занимаются сейчас этим девочки, преемники автора, они только на голове не стояли с бубном чтобы все заработало. |
Re: Проблема с макросом Excel | |
---|---|
boba Автор Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
Игорь, спасибо
Вариант через .fileds('fieldname').value в случае указания имени поля для суммы лег верно в Excel Type, datatype оба дали ньюмерический тип для этого имени поля, так что не совсем понятно, как присвоение без value ухитрилось дать в ексел чар тип. Ну и черт с ним, работает и все. Посмотрел свои древние примеры на Oracle objects for ole Везде писал value, а не как в примере в головной теме |
Re: Проблема с макросом Excel | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В фоксе, насколько я помню, не работает синтаксис с "дефолтными свойствами" - там только явно ручками и можно писать было. А почему VBA чудить стал для этого самого синтаксиса с ! - понятия не имею. Ещё по идее есть вариант с полу-дефолтным обращением OraDynaSet!DMBTR.value - может и он бы решил проблему...
P.S. Вообще-то в OraDynaSet-е есть метод GetRows, который сразу массив вернёт с данными - и если аккуратно всё закодить (и оно не станет с типами чудить), то вместо этих ужасных километровых циклов с перечислением полей, и абсолютно безумным обращением по "именам ячеек" будет аккуратное присвоение этого массива нужному Range на листе. При том как раз в фоксе с этим явно будет больше проблем чем в VBA - т.к. там параметр-массив фигурирует При работе через OLEDB или ODBC тоже не потребуется "поячеечно и позаписно" распихивать результат на страницу. Впрочем, может им как раз за количество строк кода платят, потому даже тривиальное "обнуление" диапазона настолько через ж*пу сделано, что у меня аж кровавые слёзы текут ------------------ WBR, Igor |
Re: Проблема с макросом Excel | |
---|---|
boba Автор Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
Игорь,
я с этим копаться особо не собираюсь. Есть внешняя команда этого проекта. Помогли им , и уже хорошо. Мне вряд ли это потребуется, пишем через обычный одбс из фокса. Если что нужно в ексел, кидаем массивы. Давно на это классы написаны, через Oracle objects for ole ничего не пишем. Не за чем. Сейчас таки воспроизвел тест кода на фоксе. Так и там чар поле суммы вернулось. У меня, конечно, склероз, но не до такой степени. Посмотрел свои коды 98-99 года, нигде не делал никакой такой конвертации типов. |
Re: Проблема с макросом Excel | |
---|---|
boba Автор Сообщений: 6269 Откуда: Медвежьи озера- Дата регистрации: 26.03.2001 |
Все таки покопался.
Маразм какой-то Сплошь и рядом при выгребке поля типа число из Оракл свойства dynaset Type=10-это чар OralDataType=2 это число В доке написана туманная фраза , про внутреннюю конвертацию типов в целях соответствия данных на Оракл и VisualBasic Бесит, что это сплошь и рядом не в 100% случаев. Для кондовенькой таблицы смог получить верное соответствие. Получается, нужно учитывать на стороне клиента эти свойства и перегонять из типа в тип, если они не сошлись по смыслу. Слава богу самому ничего таким кодом писать не нужно. |
Re: Проблема с макросом Excel | |
---|---|
прошелмимо Сообщений: 784 Дата регистрации: 21.02.2012 |
select BUKRS, SCAPTION
Вы фоксом в таблицы сапа лазаете? Жесть какая. |
© 2000-2024 Fox Club  |