Текущее время: Вт, авг 19 2025, 00:41

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос по VBA Excel
СообщениеДобавлено: Вт, ноя 17 2009, 14:49 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, фев 16 2006, 15:46
Сообщения: 451
Откуда: Россия
Как на VBA Excell устроить, чтобы была подпрограмма, работающая примерно так:

Code:
Set ws = Worksheets("Отчёт")
FormatRange(ws.Range("A1"))
FormatRange(ws.Range("B10:C20"))
...


Т.е. как организовать передачу Range в подпрограмму? Все мои старания упираются в ошибку Object required (Error 424). Понятно, вопрос синтаксиса, но что-то никак не выходит, не по ссылке, никак.

_________________
Ян Владимирович,
http://www.vladimirovich.net


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по VBA Excel
СообщениеДобавлено: Вт, ноя 17 2009, 17:30 
Начинающий
Начинающий

Зарегистрирован:
Вт, июн 16 2009, 09:31
Сообщения: 23
Sub Macro1() ' Kakaja-to programma
Set ws = Worksheets("Sheet1")
x = FormatRange(ws, "A1") ' Prisvoenie Range peremennoj
Call FormatRange(ws, "B10:C20") ' Vyzov podprogrammy
End Sub

Function
FormatRange(w, a) ' Podprogramma
FormatRange = w.Range(a)
End Function


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Вопрос по VBA Excel
СообщениеДобавлено: Вт, ноя 17 2009, 18:24 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, июл 03 2007, 10:26
Сообщения: 486
Откуда: Kazakhstan, Astana
Пол: Мужской
Private Sub ZFormatRange(ws As Worksheet, ZRange As String)
Sheets(ws.Name).Range("A1").Value = 100
Sheets(ws.Name).Range(ZRange).Value = 1000
End Sub

Удобнее
Private Sub ZFormatRange_1(ws As String, ZRange As String)
Sheets(ws).Range(ZRange).Value = 1000
End Sub

Private Sub CommandButton1_Click()
Dim Z As Worksheet
Set Z = Sheets("Лист1")
Call ZFormatRange(Z, "A1:A2")
call ZFormatRange_1("Лист1","B1:B2")
End Sub

Чтобы динамично обрабатывать диапазоны в Рабочей книге Excel удобно работать так:

Sheets(MainSheet_1).Range(Cells(RRow, RCol), Cells(RRow, RColCount)).Interior.ColorIndex = 15

Либо так =
Public Sub ZClearSheet(SheetName As String, RowStart As Long, RowEnd As Long)
Sheets(SheetName).Range("A" & CStr(RowStart) & ":BW" & CStr(RowEnd)).Clear
End Sub

Call ZClearSheet(MainSheet_1, 15, 65536)

_________________
"Great minds discuss ideas. Average minds discuss events. Small minds discuss people-Eleanor Roosevelt--Knowledge is to share, Keep it free, Keep sharing"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по VBA Excel
СообщениеДобавлено: Пн, ноя 23 2009, 16:58 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, окт 11 2005, 12:10
Сообщения: 687
Откуда: Москва
Пол: Мужской
Уважаемые!
Не пользуйтесь пожалуйста никогда, слышите никогда в коде определением листа по имени и ссылками на диапазоны стиля A1:B2.
Для объекта каждого листа есть переменная и вместо Set ws = Worksheets("Отчёт") проще и надежней использовать Set ws = Лист1, можно даже поменять CodeName у листа и вообще будет красиво:
FormatRange(Report.Cells(1,1))

Все это нужно потому, что пользователь может всегда переименовать лист или поменять стиль ссылок в книге, и запретить это непросто.

Вот пример функции для удаления строк в диапазоне данных (из работающей книги, поэтому там немного больше, чем нужно для общего случая):
Code:
Sub DelLines(ASheet As Worksheet, DeletionRng As Range)

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
   
    On Error GoTo Finish
   
    Dim AOSheet As Object
    Set AOSheet = ASheet
   
    Dim DataRng As Range
    Set DataRng = AOSheet.SpecialRange("DATA")
   
    If Not Intersect(DataRng, AOSheet.SpecialRange("TOP")) Is Nothing Or _
       Not Intersect(DataRng, AOSheet.SpecialRange("BOTTOM")) Is Nothing Then
        GoTo Finish
    End If
   
    Dim Row As Range
    Dim DeletionRows As Range
    Dim DeletionRange As Range
     

    On Error GoTo BadRange
   
   
    Set DeletionRange = Intersect(DataRng, DeletionRng)
   
    On Error GoTo 0
    'On Error GoTo Finish
   
    GoTo GoodRange

BadRange:
        On Error GoTo 0
        Output "Выделенная область находится вне диапазона данных!", vbInformation
        GoTo Finish
GoodRange:
   
    On Error GoTo Finish
   
    UnProtectSheet ASheet
   
    For Each Row In DeletionRange.Rows
        If DeletionRows Is Nothing Then
            Set DeletionRows = Row.EntireRow
        Else
            Set DeletionRows = Union(DeletionRows, Row.EntireRow)
        End If

    Next Row

    If Not DeletionRows Is Nothing Then
        DeletionRows.Rows.Delete
    End If
    AOSheet.SpecialRange("BOTTOM").Activate
   
Finish:
    Application.ScreenUpdating = True
   
    If Err.Number <> 0 Then Output "Ошибка при удалении строк на листе """ & ASheet.Name & """.", vbCritical

    On Error GoTo 0
   
    Application.Calculation = xlCalculationAutomatic
    Application.Calculate
   
    ProtectSheet ASheet
End Sub


и ее вызов:
Code:
Private Sub DelLinesBtn_Click()
    Activate
    DelLines ActiveSheet, Selection
End Sub

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по VBA Excel
СообщениеДобавлено: Пн, ноя 23 2009, 17:09 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, окт 11 2005, 12:10
Сообщения: 687
Откуда: Москва
Пол: Мужской
BORLAND написал:
Либо так =
Public Sub ZClearSheet(SheetName As String, RowStart As Long, RowEnd As Long)
Sheets(SheetName).Range("A" & CStr(RowStart) & ":BW" & CStr(RowEnd)).Clear
End Sub

Call ZClearSheet(MainSheet_1, 15, 65536)


Тогда уж как-то так, чтоб для Excel 2007 переписывать не пришлось:
Code:
Public Sub ZClearSheet(Sh As WorkSheet, RowStart As Long, RowEnd As Long)
    Sh.Range(Sh.Rows(RowStart), Sh.Rows(RowEnd)).Clear
End Sub


Update
Только что обратил внимание на название функции -- зачет :)

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по VBA Excel
СообщениеДобавлено: Пн, ноя 30 2009, 11:11 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Вт, сен 13 2005, 10:41
Сообщения: 558
Откуда: Гондурас (округ Москвы)
Пол: Мужской
коротко так

sub FormatRange ( byref ws as Worksheet, byref r as Range )
....
end sub

ошибка, связанная с передачей объекта Range была вызвана скорее всего с тем, что по умолчанию
VBA передает такие объекты по ссылке (byref), поэтому надо сначала присвоить Range переменной, а
потом ее передавать параметром.

Dim myRange as Range
set myRange = MyWorksheet.Range("A1")

а потом уже вызывать

call FormatRange ( myRange )


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по VBA Excel
СообщениеДобавлено: Пн, ноя 30 2009, 12:07 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, окт 11 2005, 12:10
Сообщения: 687
Откуда: Москва
Пол: Мужской
Проблема в чем-то другом, приведенный ниже код работает на ура.
Code:
Sub FormatRange(r As Range)
   r.Cells(1, 1).Value = "12"
End Sub


Sub TST()
  FormatRange (ActiveSheet.Range("A1"))
End Sub

С объектами же следующий момент -- их хоть по значению, хоть по ссылке передавай разницы нет, т.к. передается только ссылка ссылка на объект (не будет же эксель создавать копию листа, только ради того, что вы решили передать его как параметр в процедуру):
Code:
Sub ObjByVal(ByVal r As Range)
   r.Cells(1, 1).Value = "ObjByVal()"
End Sub

Sub TstVal()
  ActiveSheet.Range("A1").Value = "TstVal()"
  ObjByVal ActiveSheet.Range("A1")
  MsgBox CStr(ActiveSheet.Range("A1").Value)
End Sub

Результат:
Code:
---------------------------
Microsoft Excel
---------------------------
ObjByVal()
---------------------------
ОК   ---------------------------


Обновлено
Попробовал вот так:
Code:
Sub FormatRange(r As Range)
r.Cells(1, 1).Value = Now
Set r = ActiveSheet.Range("A2")
r.Cells(1, 1).Value = Now - 1
End Sub

Sub TST()
  FormatRange (ActiveSheet.Range("A1"))
End Sub


Упорно работает (подставлял byRef и byVal).

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по VBA Excel
СообщениеДобавлено: Пн, ноя 30 2009, 12:25 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Вт, сен 13 2005, 10:41
Сообщения: 558
Откуда: Гондурас (округ Москвы)
Пол: Мужской
да, вы правы.
скорее всего ошибка в книге просто нет листа "Отчёт"
надо бы просто сделать проверку

on error resume next
Set ws = Worksheets("Отчёт")
if err.Number <> 0 then
.....
endif
...

on error goto 0


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос по VBA Excel
СообщениеДобавлено: Пн, ноя 30 2009, 12:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, окт 11 2005, 12:10
Сообщения: 687
Откуда: Москва
Пол: Мужской
Ну вот :)
+ рад, что кто-то еще на форуме обработкой ошибок занимается :)

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


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

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


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

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


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

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