Текущее время: Вс, авг 17 2025, 19:21

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вс, авг 10 2008, 21:53 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Вс, авг 10 2008, 20:47
Сообщения: 35
Откуда: Москва
AIG написал(а):
Lench, я тебе скриптов по VBA пришлю, только скажи... :wink:

AIG, а можешь и мне прислать VBA скрипты, которые из 2 (и более) запросов (читай: таблиц) с идентичной структурой столбцов делает одну "итоговую" таблицу :roll:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, авг 11 2008, 17:30 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Вс, авг 10 2008, 20:47
Сообщения: 35
Откуда: Москва
Вобщем, написал ткой вот код:
Цитата:
Public Function BEx() As BExApplication
Set BEx = Application.Run("BExAnalyzer.xla!GetBEx", ThisWorkbook)
End Function

Sub Formula (queryID As String, resultArea As Range)
Dim Row As Integer
Dim Col As Integer

Dim RowCopy As Integer
Dim ColCopy As Integer

Dim numcells As Integer

Dim i As Integer
Dim Str As String
Dim WCell As Range



numcells = resultArea.Worksheet.Cells.Count


Select Case queryID
Case "DP_2"

Row = resultArea.Worksheet.Cells(numcells).Row + 1
Col = resultArea.Worksheet.Cells(1).Column

RowCopy = resultArea.Cells(1).Row + 5
ColCopy = resultArea.Cells(1).Column

Set WCell = resultArea.Cells(RowCopy, ColCopy)

If Not (WCell Is Nothing) Then

Str = resultArea.Cells(RowCopy, ColCopy).Value
i = InStrRev(Str, ",")

If i > 0 Then
Str = Right(Str, Len(Str) - i - 1)
resultArea.Worksheet.Cells(Row, Col).Value = "'" + Str
End If
End If
End Select
End Sub

Он должен был "присоединять" таблицу со второго листа экселя снизу к таблице с первого листа.
Шапка обеих страниц - 5 строк.
Только вот не работает :oops: Дебагер выдает ошибку "Overflow"... Где у меня косяк в коде?

P.S. Если из "numcells = resultArea.Worksheet.Cells.Count" убрать "Worksheet" - дебагер отрабатывает без ошибок, но и таблицы не "сливаются"... У кого есть идеи, в чем дело? :?:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, авг 11 2008, 21:55 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пн, фев 21 2005, 00:50
Сообщения: 10284
Откуда: г.Мышуйск
Пол: Женский
Integer variables are stored as 16-bit (2-byte) numbers ranging in value from -32,768 to 32,767.
Может, недостаточно для resultArea.Worksheet.Cells.Count - т.е. кол-во ячеек больше 32 767? Потому и overflow.
Dim numcells As Long Вам поможет.

Обнуление переменных после их объявления никому никогда ещё не вредило, numcells = 0, далее по тексту

Ну и лучше назвать разные листы книги по-разному, и явно обращаться по имени к каждому.

_________________
Пушномолочная свинья-несушка (тест)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, авг 12 2008, 01:26 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Вс, авг 10 2008, 20:47
Сообщения: 35
Откуда: Москва
LadyWind написала:
Integer variables are stored as 16-bit (2-byte) numbers ranging in value from -32,768 to 32,767.
Может, недостаточно для resultArea.Worksheet.Cells.Count - т.е. кол-во ячеек больше 32 767? Потому и overflow.
Dim numcells As Long Вам поможет.

Обнуление переменных после их объявления никому никогда ещё не вредило, numcells = 0, далее по тексту

Ну и лучше назвать разные листы книги по-разному, и явно обращаться по имени к каждому.

По поводу названия листов - соглашусь. :!:
А насчет обнуления счетчика ячеек - в дебагере смотрел пошаговое выполнение - изначально переменная = 0 :cry: Да и переполнение оно мне выдало на тестовом примере с одной единственной записью...
Вобщем, завтра (уже сегодня...) с утра буду проверять...

P.S. VBA Сегодня первый раз увидел, так что не судите строго :roll:
P.P.S. LadyWind, big 10x, я уж и не надеялся тут ответ получить :P


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, авг 12 2008, 10:44 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Вс, авг 10 2008, 20:47
Сообщения: 35
Откуда: Москва
С удивлением для себя обнаружил, что в VBA-макросе нельзя автоматом обращаться к таблице запроса (GRID_1 и т.д.) как к объекту Range.
Это у меня руки такие кривые или реально нельзя GRID_1 явно использовать как массив и макросу нужно его определять явно? :cry:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, авг 13 2008, 10:26 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, апр 19 2007, 08:03
Сообщения: 197
Пол: Мужской
YoungBDO написал(а):
Он должен был "присоединять" таблицу со второго листа экселя снизу к таблице с первого листа.
Шапка обеих страниц - 5 строк.

Если надо разместить один запрос под другим, просто перенесите одну resultArea под другую (можно обе вообще на третий лист), и будет Вам счастье :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, авг 13 2008, 10:30 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Вс, авг 10 2008, 20:47
Сообщения: 35
Откуда: Москва
Dimoney написал:
Если надо разместить один запрос под другим, просто перенесите одну resultArea под другую (можно обе вообще на третий лист), и будет Вам счастье :)

Неплохо бы еще заголовок у присоединяемой таблицы вырезать :P


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, авг 13 2008, 11:44 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, апр 19 2007, 08:03
Сообщения: 197
Пол: Мужской
YoungBDO написал(а):
Dimoney написал:
Если надо разместить один запрос под другим, просто перенесите одну resultArea под другую (можно обе вообще на третий лист), и будет Вам счастье :)

Неплохо бы еще заголовок у присоединяемой таблицы вырезать :P

Удаление 2х строк - 1 строка VBA :)

Либо
Code:
Public ra1 As Range                     'resultArea 1-го запроса
Public ra2 As Range                     'resultArea 2-го запроса

  Select Case queryID
  Case "SAPBEXq0002"
     Set ra1 = resultArea    'На листе Sheet2
  Case "SAPBEXq0001"
    Set ra2 = resultArea    'На листе Sheet1
  End Select

Set ra2 = ra2.Offset(2, 0).Resize(ra2.Rows.Count - 2, ra2.Columns.Count)  'Убираем шапку


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, авг 13 2008, 14:55 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Вс, авг 10 2008, 20:47
Сообщения: 35
Откуда: Москва
Dimoney, большущее спасибо :P
P.S. Оставшимся камнем, который пришлось преодолеть при решении задачи - при копировании объектов Range функция Copy требует, чтобы ей на вход скормили Range.Address, а не просто Range :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB