как ссылаться на переменную массива в VBA доступ к другой переменной - PullRequest
0 голосов
/ 22 декабря 2011

Привет, ребята, я пытаюсь взять значение data (0) и поместить его, скажем, в переменную InvoiceNumber.Я попытался поместить изображение моего экрана часов, но в итоге мне не разрешили.но вот как будет выглядеть мой экран часов.данныеДанные (0)данные (0,1) 1данные (0,2) 2данные (0,3) 3

Я пробовал

dim InvoiceNumber as variant <br/>
invoiceNumber = data(0)

, но постоянно получаю сообщение об ошибке.Я не знаю, как ссылаться только на часть этого массива.любая помощь будет принята с благодарностью.

вот полный код для тех, кто хотел бы увидеть немного больше.

Dim db As Database
Dim rs As Recordset
Dim data As Variant
Dim colummn1 As Variant

Dim obj As Object


Set db = CurrentDb
Set rs = db.OpenRecordset("select * from Table1")
'set obj = new object
While Not rs.EOF
 'MsgBox (rs.RecordCount)
'MsgBox (rs.Fields.Count)

data = rs.GetRows(rs.Fields.Count)


Column1 = data.data(0)

Wend
rs.Close
db.Close

End Sub

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Попробуйте

Column1 = data(0,0) 

вместо

Column1 = data.data(0) 

data содержит двумерный массив.Первый индекс - это номер поля, второй индекс - номер строки.Оба начинаются с нуля.Итак, data(0,0) - это первое поле первого ряда.data(1,0) - это второе поле первой строки.

Я бы попытался создать массив счетов-фактур, используя пользовательский тип

Public Type Invoice
    Nr As Variant
    IssueDate As Variant
    Total As Variant
    'Or whatever your invoice contains
End Type

Public Sub TestGetRecords()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim data As Variant
    Dim numRecords As Long, i As Long
    Dim Invoices() As Invoice

    Set db = CurrentDb
    Set rs = db.OpenRecordset("select * from Table1")
    data = rs.GetRows()
    rs.Close
    db.Close

    numRecords = UBound(data, 2) + 1
    ReDim Invoices(0 To numRecords - 1) As Invoice
    For i = 0 To numRecords - 1
        Invoices(i).Nr = data(0, i)
        Invoices(i).IssueDate = data(1, i)
        Invoices(i).Total = data(2, i)
    Next i

    Debug.Print Invoices(0).Total
End Sub

Ошибка в вашем решении заключается в том, чтоВы поместили GetRows в цикле.Однако GetRows возвращает все строки сразу!

0 голосов
/ 23 декабря 2011

Мне трудно понять, чего вы пытаетесь достичь.

Вы читаете всю таблицу данных в объект набора записей, загружаете поля объекта набора записей в двумерный массив, а затем пытаетесь перебрать массив для вывода результатов в одну переменную (или сумму массива). значения).

Почему бы вам просто не использовать выражение SQL для извлечения данных непосредственно из таблицы?

Если мы можем предположить, что у вас есть таблица счетов (скажем ... "myInvoiceTable"), по крайней мере со следующими полями ...

InvoiceID invoiceValue (и, возможно, многие другие, например, invoiceDate, clientID и т. д.)

Вы можете написать выражение примерно так:

"ВЫБЕРИТЕ СУММУ (invoiceValue) КАК MyTotal ИЗ myInvoiceTable, ГДЕ invoiceID> xxxx"

Это может войти в ваш код VBA следующим образом.

Dim rst as Recordset
Dim strSQL as string

strSQL = "SELECT SUM(invoiceValue) AS MyTotal FROM myInvoiceTable WHERE invoiceID > 400" '-- use an appropriate WHERE clause if needed

Set rst = CurrentDb.Openrecordset(strSQL) '-- the rst object should contain a single value "MyTotal" which is the sum of the fields you are trying to access

MsgBox rst!MyTotal '-- use this value wherever you need to use it
...