Страницы: 1
RSS
Обращение к ячейкам Access в цикле VBA
 
Добрый день. Как обращаться к ячейке таблицы Access в цикле VBA? В Excel это cells(1,1), в массиве это a(0,0). Как мне сделать цикл по ячейкам Access с вычислениями? Допустим, в первом столбце под названием "Арт" будут артикулы в виде цифр от 1 до 10. Во втором столбце "Цена" будут суммы (все по 100 для примера). Мне нужно пройти циклом по всем строкам таблицы.
Код
Sub perebor()
Dim db As Database
Dim rs As Recordset
Dim lngRecordCount As Long

Set db = CurrentDb
Set rs = db.OpenRecordset("q_promoexcel", dbOpenDynaset)
If rs.RecordCount <> 0 Then
rs.MoveLast

lngRecordCount = rs.RecordCount
rs.MoveFirst

     For i = 4 To lngRecordCount
       If rs(i,1) = rs(i-1,1) then rs(i,3) = rs(i-1,2)+rs(i,2) 'как обратиться к этим ячейкам правильно?
     Next

        rs.Close
        db.Close

End Sub
 
rs.GetRows
 
МатросНаЗебре, то есть мне нужно будет вытаскивать в массив, чтобы произвести эти расчеты?
Изменено: Hellmaster - 16.10.2019 12:54:36
 
Hellmaster, Пержде всего наждо забыть про понятие ячеек в таблице Аccess. Есть записи и в них поля.  К полям записи вроде  можно обратится по индексу, но правильнее, "уважительно" по имени. По записям перемещатся надо через  rs.MoveNext, но у вас еще и изменить значение похоже надо в таблице, а значит убдайтить таблицу.
Изменено: БМВ - 16.10.2019 13:03:10
По вопросам из тем форума, личку не читаю.
 
А если хочется, как по ячейкам, то можно присвоить значения в массив
Код
a = rs.GetRows
И потом обращаться как с ячейками a(x,y).
 
Поправка, записывать не выйдет, так можно только читать.
 
Уже пробовал через массив. Как то долго получается. Хочется сразу в access сделать расчеты. Это возможно вообще?
 
Код
Sub qq()
    Set rs = Db.OpenRecordset("q_promoexcel", dbOpenDynaset)
    rs.MoveNext: rs.MoveNext: rs.MoveNext
    x = rs(1): xx = rs(2)
    rs.MoveNext
    Do While Not rs.EOF
        If rs(1) = x Then
            rs.Edit
            rs(3) = xx + rs(2)       
            rs.Update
        End If
        x = rs(1): xx = rs(2)
        rs.MoveNext
    Loop
        rs.Close
End Sub
Изменено: RAN - 16.10.2019 13:49:53
 
http://www.codevba.com/msaccess/dao_recordset.htm#.Xaby-nduIwY

Кошак опередил. и про индекс подтвердил и …… Более менее полноценно access пользовал наверно до 2000го года, а руки то помнят, помнят родимые  :-)
Изменено: БМВ - 16.10.2019 13:40:52
По вопросам из тем форума, личку не читаю.
 
БМВ, спасибо за ссылку.
RAN,  спасибо за макрос. Можете объяснить строки
Код
rs.MoveNext: rs.MoveNext: rs.MoveNext    
x = rs(1): xx = rs(2)
Для чего это нужно и почему потом идет условие?
Код
If rs(1) = x Then
 
Цитата
Hellmaster написал:
Можете объяснить строки
это так по КОТовски переходят на запись 4 (или как вы привыкли четвертую строку) .  Андрей, а на каком индексе переходить на цикл?  :D
По вопросам из тем форума, личку не читаю.
 
Все, до меня дошло что происходит в этом коде. Спасибо большое
 
Ведмедь, чего пристал? Я сам всего третий или четвертый раз макрос для Recordset написал.  :)
 
Цитата
RAN написал:
Ведмедь, чего пристал?
ну я ж и не написал что сКОТский  :D  
Если серьезно, то наверно не в краткости дело, но цикл он бы понятнее был особенно если for I =1 to 4-1 , где прослеживается связь с желанной строкой 4
По вопросам из тем форума, личку не читаю.
 
Добрый день. Сделал все-таки через массив. Может кому-то пригодится:
Код
Sub perebor()

Dim dbsNorthwind As Database
Dim rstEmployees As Recordset
Dim b()
Dim bb()
Dim myTab As TableDef
Dim myF As Field
Dim stsql As String
Dim rs As Recordset

Set dbsNorthwind = OpenDatabase("путь к файлу")
Set rstEmployees = dbsNorthwind.OpenRecordset("SELECT * FROM q_promoexcel")
    b = rstEmployees.GetRows(rstEmployees.RecordCount)
    bb = TransposeArray(b)
     Erase b
     For i = 4 To rstEmployees.RecordCount - 1

      'Подсчеты

      Next
         
dbsNorthwind.Execute ("delete*from TEST")  'таблица уже имеется в БД, поэтому очищаю ее, чтобы вставить новые данные.

Set rs = dbsNorthwind.OpenRecordset("TEST")
        
For i = 0 To rstEmployees.RecordCount - 1
With rs
.AddNew
.Fields(0) = bb(i, 0)
.Fields(1) = bb(i, 1)
.Fields(2) = bb(i, 2)
.Fields(3) = bb(i, 3)
.Fields(4) = bb(i, 4)
.Fields(5) = bb(i, 5)
.Fields(6) = bb(i, 6)
.Fields(7) = bb(i, 7)
.Update
End With
Next

        rstEmployees.Close
        Set rstEmployees = Nothing
        dbsNorthwind.Close
        Set dbsNorthwind = Nothing
        Set rs = Nothing
        Set myF = Nothing

End Sub
________________________________________________________________________________________________
Function TransposeArray(ByVal arr2x) As Variant()

    Dim arr(), r&, c&
  
ReDim arr(0 To UBound(arr2x, 2), 0 To UBound(arr2x, 1))
  
    For c = 0 To UBound(arr2x, 2)
        For r = 0 To UBound(arr2x, 1)
            arr(c, r) = arr2x(r, c)
        Next r
    Next c
TransposeArray = arr
End Function
Страницы: 1
Наверх