Текущее время: Пт, авг 22 2025, 05:38

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Помогите написать макрос на VBA
СообщениеДобавлено: Ср, июл 11 2012, 17:32 
Специалист
Специалист

Зарегистрирован:
Пн, дек 26 2011, 18:05
Сообщения: 110
Откуда: МСК
Пол: Мужской
Коллеги программисты, помогите написать макрос форматирующий отчет

задача следующая:

Есть отчет (читай таблица) к нечетным строкам которой нужно применить определенный формат ячеек который я создал ранее.

Пример:

Дано

116558 123185 222182
32 14 17

Должно получиться

11.65.58 12.31.85 22.21.82
32 14 17

Спасибо


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Чт, июл 12 2012, 11:49 
Специалист
Специалист

Зарегистрирован:
Пн, дек 26 2011, 18:05
Сообщения: 110
Откуда: МСК
Пол: Мужской
Небольшое уточнение :)

Помогите написать кусок кода (цикл), который пробегает по всем строкам и столбцам.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Чт, июл 12 2012, 11:54 
Почетный гуру
Почетный гуру

Зарегистрирован:
Чт, фев 03 2005, 10:18
Сообщения: 503
:shock: по всем строкам и столбцам на листе? Или в таблице анализа? И зачем по столбцам, если в первом сообщении писалось про форматирование строк?


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Чт, июл 12 2012, 13:52 
Специалист
Специалист

Зарегистрирован:
Пн, дек 26 2011, 18:05
Сообщения: 110
Откуда: МСК
Пол: Мужской
Air_demon написал(а):
:shock: по всем строкам и столбцам на листе? Или в таблице анализа? И зачем по столбцам, если в первом сообщении писалось про форматирование строк?



По таблице анализа.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Чт, июл 12 2012, 13:54 
Председатель
Председатель

Зарегистрирован:
Чт, май 10 2007, 09:15
Сообщения: 1558
Только не понятно, как принцип надо применить, после каждых двух символом поставить точку ?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Чт, июл 12 2012, 14:09 
Специалист
Специалист

Зарегистрирован:
Пн, дек 26 2011, 18:05
Сообщения: 110
Откуда: МСК
Пол: Мужской
hub2002 написал(а):
Только не понятно, как принцип надо применить, после каждых двух символом поставить точку ?


Нужно просто применить определенный формат (стиль) ячейки, который я создал


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA  Тема решена
СообщениеДобавлено: Чт, июл 12 2012, 16:43 
Почетный гуру
Почетный гуру

Зарегистрирован:
Чт, фев 03 2005, 10:18
Сообщения: 503
Как вариант можно вот так:
Code:
Option Explicit

Private Const DebugModeOn = False           ' false отключает возможность взаимодействовать с
                                            ' книгой во время работы макроса

'------------------------- основной модуль (вызавается при обновлении каждого запроса)-----------------------------
Sub BExOnRefresh(ParamArray varname())
    Dim dataRange        As Range
    Dim dataOffsetX      As Integer
    Dim dataOffsetY      As Integer
    Dim DPOffsetX        As Integer
    Dim DPOffsetY        As Integer
    Dim dataColumnsCount As Integer
    Dim dataRowsCount    As Integer
    Dim isEmpty          As Boolean
    Dim FRange           As Range
    Dim R                As Integer
    Dim WN               As String
   
    If Not DebugModeOn Then
        Application.ScreenUpdating = False
        Application.Interactive = False
        Application.EnableEvents = False
        Application.DisplayAlerts = False
    End If
   
    WN = varname(1).Worksheet.Name
   
    'Определение начальной строки и столбца ячейки с данными
    dataOffsetX = BEx.DataProviders(varname(0)).Result.Grid.firstdatacell.x
    dataOffsetY = BEx.DataProviders(varname(0)).Result.Grid.firstdatacell.y
                   
    'Определение начальной строки и столбца таблицы
    DPOffsetX = varname(1).Column
    DPOffsetY = varname(1).Row
   
    ' Если данные в датапровайдере есть данные - определение количества строк и столбцов в таблице с результатом
    If dataOffsetY > 0 Then
        dataColumnsCount = varname(1).Columns.count - dataOffsetX
        dataRowsCount = varname(1).Rows.count - dataOffsetY
        isEmpty = False
    Else
        isEmpty = True
    End If
           
    If Not isEmpty Then
        ' область с данными
        Set dataRange = Range(Worksheets(WN).Cells(DPOffsetY + dataOffsetY, DPOffsetX + dataOffsetX), _
                                        Worksheets(WN).Cells(DPOffsetY + dataOffsetY + dataRowsCount - 1, DPOffsetX + dataOffsetX + dataColumnsCount - 1))
        Set FRange = dataRange.Rows(1)
        For R = 3 To dataRange.Rows.count Step 2
            Set FRange = Union(FRange, dataRange.Rows(R))
        Next R
       
        FRange.Style = "myStyle"
    End If
       
    If Not DebugModeOn Then
        Application.ScreenUpdating = True
        Application.Interactive = True
        Application.EnableEvents = True
        Application.DisplayAlerts = True
    End If

End Sub




Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Пт, июл 13 2012, 12:42 
Специалист
Специалист

Зарегистрирован:
Пн, дек 26 2011, 18:05
Сообщения: 110
Откуда: МСК
Пол: Мужской
Серьезно :)

Спасибо, буду разбираться :)

Air_demon написал(а):
Как вариант можно вот так:
Code:
Option Explicit

Private Const DebugModeOn = False           ' false отключает возможность взаимодействовать с
                                            ' книгой во время работы макроса

'------------------------- основной модуль (вызавается при обновлении каждого запроса)-----------------------------
Sub BExOnRefresh(ParamArray varname())
    Dim dataRange        As Range
    Dim dataOffsetX      As Integer
    Dim dataOffsetY      As Integer
    Dim DPOffsetX        As Integer
    Dim DPOffsetY        As Integer
    Dim dataColumnsCount As Integer
    Dim dataRowsCount    As Integer
    Dim isEmpty          As Boolean
    Dim FRange           As Range
    Dim R                As Integer
    Dim WN               As String
   
    If Not DebugModeOn Then
        Application.ScreenUpdating = False
        Application.Interactive = False
        Application.EnableEvents = False
        Application.DisplayAlerts = False
    End If
   
    WN = varname(1).Worksheet.Name
   
    'Определение начальной строки и столбца ячейки с данными
    dataOffsetX = BEx.DataProviders(varname(0)).Result.Grid.firstdatacell.x
    dataOffsetY = BEx.DataProviders(varname(0)).Result.Grid.firstdatacell.y
                   
    'Определение начальной строки и столбца таблицы
    DPOffsetX = varname(1).Column
    DPOffsetY = varname(1).Row
   
    ' Если данные в датапровайдере есть данные - определение количества строк и столбцов в таблице с результатом
    If dataOffsetY > 0 Then
        dataColumnsCount = varname(1).Columns.count - dataOffsetX
        dataRowsCount = varname(1).Rows.count - dataOffsetY
        isEmpty = False
    Else
        isEmpty = True
    End If
           
    If Not isEmpty Then
        ' область с данными
        Set dataRange = Range(Worksheets(WN).Cells(DPOffsetY + dataOffsetY, DPOffsetX + dataOffsetX), _
                                        Worksheets(WN).Cells(DPOffsetY + dataOffsetY + dataRowsCount - 1, DPOffsetX + dataOffsetX + dataColumnsCount - 1))
        Set FRange = dataRange.Rows(1)
        For R = 3 To dataRange.Rows.count Step 2
            Set FRange = Union(FRange, dataRange.Rows(R))
        Next R
       
        FRange.Style = "myStyle"
    End If
       
    If Not DebugModeOn Then
        Application.ScreenUpdating = True
        Application.Interactive = True
        Application.EnableEvents = True
        Application.DisplayAlerts = True
    End If

End Sub




Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Пн, июл 16 2012, 11:06 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, окт 11 2005, 12:10
Сообщения: 687
Откуда: Москва
Пол: Мужской
Air_demon, подскажите, где можно посмотреть свойства и методы объекта BEx?
А в качестве бонуса Вам следующий код:
Code:

Sub Output(ByVal Text As String, ByVal Level As Integer)

    If Not (Err Is Nothing) Then
        If Err.Number <> 0 Then
            Text = Text & _
                vbCrLf & "Номер: " & Err.Number & _
                vbCrLf & "Описание: " & Err.Description & _
                vbCrLf & "Место возникновения: " & Err.Source
            Level = vbCritical
        End If
    End If
   
    Call MsgBox(Text, vbOKOnly + Level, MsgBoxTitle)
End Sub

...

  If Not DebugModeOn Then
        Application.ScreenUpdating = False
        Application.Interactive = False
        Application.EnableEvents = False
        Application.DisplayAlerts = False
    End If
    On Error GoTo ExitCallBack
...
' здесь логика
...

ExitCallBack:
   
    If Not DebugModeOn Then
        Application.ScreenUpdating = True
        Application.Interactive = True
        Application.EnableEvents = True
        Application.DisplayAlerts = True
    End If
   
    If Err.Number > 0 Then
        Output "Ошибка в работе макроса.", vbCritical
    End If
   
    On Error GoTo 0
...     

_________________
Глаза боятся, а руки крюки


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Пн, июл 16 2012, 11:40 
Почетный гуру
Почетный гуру

Зарегистрирован:
Чт, фев 03 2005, 10:18
Сообщения: 503
G написал:
Air_demon, подскажите, где можно посмотреть свойства и методы объекта BEx?


Можно установить Microsoft Visual Studio Express и через "Обозреватель объектов" (F2) просмотреть классы из BexApi.dll
BexApplication - это и есть тот самый объект Bex.

G написал:
А в качестве бонуса Вам следующий код:


Спасибо.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Пн, июл 16 2012, 11:47 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, окт 11 2005, 12:10
Сообщения: 687
Откуда: Москва
Пол: Мужской
Спасибо большое.

_________________
Глаза боятся, а руки крюки


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Пт, июл 20 2012, 09:32 
Начинающий
Начинающий

Зарегистрирован:
Ср, окт 26 2011, 13:49
Сообщения: 16
Air_demon написал(а):
Как вариант можно вот так:
Code:
Option Explicit

Private Const DebugModeOn = False           ' false отключает возможность взаимодействовать с
                                            ' книгой во время работы макроса

'------------------------- основной модуль (вызавается при обновлении каждого запроса)-----------------------------
Sub BExOnRefresh(ParamArray varname())
    Dim dataRange        As Range
    Dim dataOffsetX      As Integer
    Dim dataOffsetY      As Integer
    Dim DPOffsetX        As Integer
    Dim DPOffsetY        As Integer
    Dim dataColumnsCount As Integer
    Dim dataRowsCount    As Integer
    Dim isEmpty          As Boolean
    Dim FRange           As Range
    Dim R                As Integer
    Dim WN               As String
   
    If Not DebugModeOn Then
        Application.ScreenUpdating = False
        Application.Interactive = False
        Application.EnableEvents = False
        Application.DisplayAlerts = False
    End If
   
    WN = varname(1).Worksheet.Name
   
    'Определение начальной строки и столбца ячейки с данными
    dataOffsetX = BEx.DataProviders(varname(0)).Result.Grid.firstdatacell.x
    dataOffsetY = BEx.DataProviders(varname(0)).Result.Grid.firstdatacell.y
                   
    'Определение начальной строки и столбца таблицы
    DPOffsetX = varname(1).Column
    DPOffsetY = varname(1).Row
   
    ' Если данные в датапровайдере есть данные - определение количества строк и столбцов в таблице с результатом
    If dataOffsetY > 0 Then
        dataColumnsCount = varname(1).Columns.count - dataOffsetX
        dataRowsCount = varname(1).Rows.count - dataOffsetY
        isEmpty = False
    Else
        isEmpty = True
    End If
           
    If Not isEmpty Then
        ' область с данными
        Set dataRange = Range(Worksheets(WN).Cells(DPOffsetY + dataOffsetY, DPOffsetX + dataOffsetX), _
                                        Worksheets(WN).Cells(DPOffsetY + dataOffsetY + dataRowsCount - 1, DPOffsetX + dataOffsetX + dataColumnsCount - 1))
        Set FRange = dataRange.Rows(1)
        For R = 3 To dataRange.Rows.count Step 2
            Set FRange = Union(FRange, dataRange.Rows(R))
        Next R
       
        FRange.Style = "myStyle"
    End If
       
    If Not DebugModeOn Then
        Application.ScreenUpdating = True
        Application.Interactive = True
        Application.EnableEvents = True
        Application.DisplayAlerts = True
    End If

End Sub


А зачем такие сложности для определения области запроса?
Ведь в varname(1) лежит ссылка на таблицу анализа (непосредственно range с результатом запроса)
То есть например:
dim rr as range
set rr = varname(1)
тогда:
rr.row - первая строка области результата
rr.column - первый столбец области результата
Ну а дальше делайте с ней что Вашей душе угодно :)
Ну и для определения листа на котором находится наш запрос можно сделать тоже всё проще:
rr - это наша область запроса
dim ws as worksheet
dim rr as range
set rr = varname(1)
set ws = rr.worksheet


Последний раз редактировалось Krispin Пт, июл 20 2012, 09:41, всего редактировалось 1 раз.

Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Пт, июл 20 2012, 09:40 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, окт 11 2005, 12:10
Сообщения: 687
Откуда: Москва
Пол: Мужской
Krispin написал(а):
А зачем такие сложности для определения области запроса?
Ведь в varname(1) лежит ссылка на таблицу анализа (непосредственно range с результатом запроса)
То есть например:
dim rr as range
set rr = varname(1)
тогда:
rr.row - первая строка области результата
rr.column - первый столбец области результата
Ну а дальше делайте с ней что Вашей душе угодно :)

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

_________________
Глаза боятся, а руки крюки


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Пт, июл 20 2012, 09:54 
Почетный гуру
Почетный гуру

Зарегистрирован:
Чт, фев 03 2005, 10:18
Сообщения: 503
Krispin написал(а):
А зачем такие сложности для определения области запроса?
Ведь в varname(1) лежит ссылка на таблицу анализа (непосредственно range с результатом запроса)


Этот Range содержит в себе и заголовок столбцов, и "боковик" и непосредственно данные, если же необходимо отдельно выделить эти области и область данных, то необходимо прибегнуть к "таким сложностям".


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите написать макрос на VBA
СообщениеДобавлено: Пт, июл 20 2012, 10:19 
Начинающий
Начинающий

Зарегистрирован:
Ср, окт 26 2011, 13:49
Сообщения: 16
Air_demon написал(а):
Krispin написал(а):
А зачем такие сложности для определения области запроса?
Ведь в varname(1) лежит ссылка на таблицу анализа (непосредственно range с результатом запроса)


Этот Range содержит в себе и заголовок столбцов, и "боковик" и непосредственно данные, если же необходимо отдельно выделить эти области и область данных, то необходимо прибегнуть к "таким сложностям".

Понял, спасибо!


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

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


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

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


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

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