Оцените плиз мой первый макрос. Что можно подкрутить - VB
Формулировка задачи:
Добрый день,
написал свой первый макрос, хотелось бы узнать мнение профи, чтобы сразу избежать ошибок и на будущее запомнить это.
Задача:
есть заполненный столбец в листе, необходимо для каждой записи из этого столбца подтянуть некоторые другие данные из БД.
Делаю:
коннект к БД и в цикле работаю с этим листом, вызывая хранимую процедуру и каждый раз передавая ей в качестве параметра значение из этого столбца. Все,что возвращает БД, помещаю в recordset и оттуда вставляю в лист.
Во время выборки максимальной даты придумал временное решение: засунуть в ячейку, потом в переменную и очистить ячейку.
Вот листинг макроса:
спасибо всем большое.
написал свой первый макрос, хотелось бы узнать мнение профи, чтобы сразу избежать ошибок и на будущее запомнить это.
Задача:
есть заполненный столбец в листе, необходимо для каждой записи из этого столбца подтянуть некоторые другие данные из БД.
Делаю:
коннект к БД и в цикле работаю с этим листом, вызывая хранимую процедуру и каждый раз передавая ей в качестве параметра значение из этого столбца. Все,что возвращает БД, помещаю в recordset и оттуда вставляю в лист.
Во время выборки максимальной даты придумал временное решение: засунуть в ячейку, потом в переменную и очистить ячейку.
Вот листинг макроса:
Листинг программы
- 'StatusBar at the end of file
- Application.StatusBar = "Importing data from SQL server..."
- 'clearing worksheet
- Worksheets("Import").Range("C2:Z50000").Clear
- 'connecting to DB to call procedure
- Set rst = New ADODB.Recordset
- Set Cnn = New ADODB.Connection
- Cnn.ConnectionString = "Provider=SQLOLEDB;Server=**;Trusted_Connection=Yes"
- Cnn.ConnectionTimeout = 0
- Cnn.CommandTimeout = 0
- Cnn.Open
- 'connecting to DB to select max(date) only once
- Set rst2 = New ADODB.Recordset
- rst2.ActiveConnection = Cnn
- Set rst2 = Cnn.Execute("select *")
- Call ActiveSheet.Cells(100, 100).CopyFromRecordset(rst2)
- rep_date = ActiveSheet.Cells(100, 100).Value
- ActiveSheet.Cells(100, 100).Clear
- Set rst2 = Nothing
- 'working with sheet "Import"
- With Sheets("Import")
- 'breaking loop
- If ((.Cells(2, 1) = "") And (.Cells(3, 1) = "")) Then
- Application.StatusBar = False
- MsgBox ("No data is available.")
- Application.ScreenUpdating = True
- Cnn.Close
- Exit Sub
- End If
- '----end breaking loop
- i = 2
- Pustoe_pole:
- Do While Not ((.Cells(i, 2) = "") And (.Cells(i, 1) = "") And (.Cells(i + 1, 2) = "") And (.Cells(i + 1, 1) = ""))
- 'reading cust_numbers
- customer = .Cells(i, 1).Value
- If customer = "" Then
- i = i + 1
- GoTo Pustoe_pole
- End If
- 'calling to procedure
- SQL_Query = "exec ** '" & customer & "','" & rep_date & "'"
- rst.Open SQL_Query, Cnn
- 'inserting data into sheet
- .Cells(i, 3).CopyFromRecordset rst
- rst.Close
- i = i + 1
- Loop
- .Cells.Columns.AutoFit
- End With
- 'Ending
- Set rst = Nothing
- Cnn.Close
- Set Cnn = Nothing
- Application.StatusBar = False
- MsgBox "Done!"
- End Sub
спасибо всем большое.
Решение задачи: «Оцените плиз мой первый макрос. Что можно подкрутить»
textual
Листинг программы
- ' промежуточное сохранение на лист - лишнее:
- ' Call ActiveSheet.Cells(100, 100).CopyFromRecordset(rst2)
- ' rep_date = ActiveSheet.Cells(100, 100).Value
- ' ActiveSheet.Cells(100, 100).Clear
- rep_date = rst2(0).Value
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д