Avatar billede blolsen Juniormester
02. februar 2014 - 15:19 Der er 3 kommentarer

opfølgning på "Sammelign felter i Access, hvor nogle er tomme"

Hej,

Jeg har følgende udfordring i Access, som jeg håber nogen har en løsning på.

Jeg har en tabel med følgende felter:

varenummer
Lageroplysning 1
Lageroplysning 2
lageroplysning 3
lageroplysning 4
Lageroplysning 5
Lageroplysning 6
lageroplysning 7
lageroplysning 8
lageroplysning 9


For hvert varenummer kan lageroplysningerne i "lageroplysning 1-9" være ens, forskellige eller tomme.

Opgaven går ud på at sammenholde om lageroplysningerne på de enkelte varenumre er ens eller forskellige.

Jeg fik tidligere følgende VBA løsning, som blev kaldt med udtrykket: Udtryk1: ENS([lageroplysning_1];[lageroplysning_2];[lageroplysning_3];[lageroplysning_4];[lageroplysning_5];[lageroplysning_6];[lageroplysning_7];[lageroplysning_8];[lageroplysning_9])

Det skal her siges, at jeg selv har tilføjet lageroplysning 5-9 i forhold til den oprindelige kode.

Public Function ENS(F1, F2, F3, F4, F5, F6, F7, F8, F9) As String
Dim OK() As Variant, A As Integer
A = 0
    If Not IsNull(F1) Then ReDim Preserve OK(A): OK(A) = F1: A = A + 1
    If Not IsNull(F2) Then ReDim Preserve OK(A): OK(A) = F2: A = A + 1
    If Not IsNull(F3) Then ReDim Preserve OK(A): OK(A) = F3: A = A + 1
    If Not IsNull(F4) Then ReDim Preserve OK(A): OK(A) = F4: A = A + 1
    If Not IsNull(F5) Then ReDim Preserve OK(A): OK(A) = F5: A = A + 1
    If Not IsNull(F6) Then ReDim Preserve OK(A): OK(A) = F6: A = A + 1
    If Not IsNull(F7) Then ReDim Preserve OK(A): OK(A) = F7: A = A + 1
    If Not IsNull(F8) Then ReDim Preserve OK(A): OK(A) = F8: A = A + 1
    If Not IsNull(F9) Then ReDim Preserve OK(A): OK(A) = F9
    ENS = False
   
    For i = 0 To UBound(OK) - 1
      For j = i + 1 To UBound(OK)
        If OK(i) = OK(j) Then
        ENS = "OK"
        Else
        ENS = "IKKE"
        Exit Function
        End If
      Next
  Next
End Function

Koden virker når tabellen indeholder få linjer, men indsætter jeg den "rigtige" tabel med små 100.000 linjer virker koden ikke.

Hvad mangler der i koden? Får en meddelelse der hedder "Ubound (OK)=<Subscript out of range>"

ER nybegynder i forhold til VBA, så kan ikke helt gennemskue, hvad der mangler:-)
Avatar billede kabbak Professor
02. februar 2014 - 16:10 #1
A As Integer
skal være
A As Long
Avatar billede bvirk Guru
03. februar 2014 - 17:01 #2
Med forventet forståelse for at nogle af os læser med af interesse, så er der, logisk forstået, for mange sammenligninger i de indlejrede for løkker i #1.
Det kræver n-1 sammenligninger at afgøre om n værdier alle er det samme - løsningen i #1 anvender (n*n+n)/2
Det betyder dog intet afviklingstidmæssigt i praksis for testning af 10 værdier at lave 55 sammenligninger mod 9.
Jeg kan ikke være med at komme med mit bud på den boolske variant:

Function allIsEqual(ParamArray arr()) As Boolean
    Const nGuid = "63ea0dea-3154-485e-b747-9f362d8d4c41" 'guidgenerator.com
    Dim i
    For Each i In arr
        If Nz(i, nGuid) <> Nz(arr(0), nGuid) Then Exit Function
    Next
    allIsEqual = True
End Function
Avatar billede blolsen Juniormester
03. februar 2014 - 18:22 #3
Hej Igen,

Har prøvet at ændre A As Integer til A as long, men koden virker desværre stadig ikke - Får beskeden "Run-time error 9 - Subscript out of range" og når jeg laver en debug af koden, peges der på linjen 

For i = 0 To UBound(OK) - 1

Når jeg går ind i Access hjælp står der "You referenced a nonexsistent array element"

nogle bud på, hvad jeg skal ændre i koden?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester