100% лучший код

Iordania
Дата: 16.11.2009 10:34:14
Добрый день.
Пришлось быстро написать код на VBA в Аксесе. Написал - тут нужен 100% рефакторинг. Не знаю, есть ли вообщо в VBA объекты, коллекции. ничего не знаю про эти скрипты!

Задача такая - есть куча ЧекБоксов на форме, нужно выбрать которые хочется и нажать кнопку ОТЧЕТ. В результате - отчет в ексель, по каждому нажатому ЧекБоксу информция выводится на новом Листе в Книге Ексель.

Я написал вот так топорно.. Как написать все в одном цикле.. Есть ли коллекции, чтобы можно было формировать ArrayList какой-нить, а потом сразув одном цикле открывать все рекордсеты...???

Set db = CurrentDb
Set Ex = New Excel.Application
Ex.SheetsInNewWorkbook = 1
Ex.Workbooks.Add

If cbPL.Value = True Then
Ex.ActiveWorkbook.Worksheets.Add
Set rst = db.OpenRecordset("incassPL", dbReadOnly)
Ex.ActiveSheet.Name = "Ïîëüøà"
Call AccessToExcel(rst, Ex)
rst.Close
Set rst = Nothing
End If
If cbEU.Value = True Then
Ex.ActiveWorkbook.Worksheets.Add
Set rst = db.OpenRecordset("incassEU", dbReadOnly)
Ex.ActiveSheet.Name = "EURO"
Call AccessToExcel(rst, Ex)
rst.Close
Set rst = Nothing
End If

... еще много-много подобных операторов Условия

Хочется сократить текст раз в 10...
а.четакова
Дата: 16.11.2009 10:50:48
Iordania
Добрый день.
Пришлось быстро написать код на VBA в Аксесе. Написал - тут нужен 100% рефакторинг. Не знаю, есть ли вообщо в VBA объекты, коллекции. ничего не знаю про эти скрипты!

Задача такая - есть куча ЧекБоксов на форме, нужно выбрать которые хочется и нажать кнопку ОТЧЕТ. В результате - отчет в ексель, по каждому нажатому ЧекБоксу информция выводится на новом Листе в Книге Ексель.

Я написал вот так топорно.. Как написать все в одном цикле.. Есть ли коллекции, чтобы можно было формировать ArrayList какой-нить, а потом сразув одном цикле открывать все рекордсеты...???

Set db = CurrentDb
Set Ex = New Excel.Application
Ex.SheetsInNewWorkbook = 1
Ex.Workbooks.Add

If cbPL.Value = True Then
Ex.ActiveWorkbook.Worksheets.Add
Set rst = db.OpenRecordset("incassPL", dbReadOnly)
Ex.ActiveSheet.Name = "Ïîëüøà"
Call AccessToExcel(rst, Ex)
rst.Close
Set rst = Nothing
End If
If cbEU.Value = True Then
Ex.ActiveWorkbook.Worksheets.Add
Set rst = db.OpenRecordset("incassEU", dbReadOnly)
Ex.ActiveSheet.Name = "EURO"
Call AccessToExcel(rst, Ex)
rst.Close
Set rst = Nothing
End If

... еще много-много подобных операторов Условия

Хочется сократить текст раз в 10...

в таком духе
Dim z, zz As New Collection, v$()
zz.add "cbPL,incassPL,Ïîëüøà"
zz.add "cbEU,incassEU,EURO"
For Each z In zz
    v = Split(CStr(z), ",")
    If Me(v(0)).Value = True Then
        Ex.ActiveWorkbook.Worksheets.add
        Set rst = db.OpenRecordset(v(1), dbReadOnly)
        Ex.ActiveSheet.Name = v(2)
        Call AccessToExcel(rst, Ex)
        rst.Close: Set rst = Nothing
    End If
Next z
Iordania
Дата: 16.11.2009 10:54:16
а.четакова,

v$() - ???
Iordania
Дата: 16.11.2009 10:59:36
Iordania,

Спасибо, дружище!