Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 20:06 Der er 51 kommentarer

Hjælp til ubound

Hej...

Jeg er ved at lave en opgave hvor man skal søge efter produkter under et cifferniveau. Der er bare en sætning der ikke virker og jeg kan simpelthen ikke finde fejlen.

For x = 1 To 9
    .Offset(0, x) = "199" & x - 1
Next x


For y = 1 To UBound(prodgr)  -Det er denne linie der ikke fungere
    .Offset(y, 0).Value = prodgr(y)
    For z = 1 To 9
        .Offset(y, z).Value = årstal(z, y)
    Next z
Next y
End With


Jeg har defineret alle variablerne men programmet kan ikke køres.

Håber i kan hjælpe.

Hilsen Lotte
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:08 #1
Hvilken fejl får du?
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:08 #2
Hvor og hvordan definerer du prodgr?
Avatar billede tubber Juniormester
05. maj 2005 - 20:10 #3
Hvordan dimmer du prodgr ?
Avatar billede tubber Juniormester
05. maj 2005 - 20:10 #4
Hov lidt sløv :)
Sad lige og lurede msdn samtidigt ?
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 20:13 #5
Jeg definere prodgr som variant... før i programmet har jeg skrevet

For i = 1 To antalgr
        cifftæller = 0
            celleindhold = .Offset(i, 0)
            indhold1 = Left(celleindhold, 2)
            indhold2 = Mid(celleindhold, 3, 2)
           
            For tæller = 1 To 7
                If Mid(celleindhold, tæller, 1) <> 32 Then
                cifftæller = cifftæller + 1
                End If
            Next tæller
    If cifftæller = ciffer Then
        If indhold1 > 27 And indhold1 < 97 Then
            If ciffer = 2 Or indhold2 <> "99" Then
                j = j + 1
                ReDim Preserve prodgr(j)
                prodgr(j) = .Offset(i, 0).Value
               
                ReDim Preserve årstal(9, j)
                    For x = 1 To 9
                        If .Offset(i, x).Value = "-" Then
                            årstal(x, j) = 0
                        Else
                            årstal(x, j) = .Offset(i, x).Value
                        End If
                    Next x
            End If
        End If
    End If
Next i
End With


Det er i denne del prodgr nævnes første gang.
Avatar billede tubber Juniormester
05. maj 2005 - 20:15 #6
du må ha en linie et sted hvor der står:

Dim prodgr(x to y) as type

et sted
hvordan ser den ud ?
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:19 #7
lotte_pigen_> Man kunne også gøre sådan her:

dim prodgr
...

prodgr(j) = prodgr & .Offset(i, 0).Value & ";"


Når du så skal bruge ubound, kan du:

prodgr = left(prodgr, len(prodgr) -1)
prodgr = split(prodgr, ";")

Så kan du bruge: for y = 0 to ubound(prodgr)

Det bruger jeg tit, når jeg programmerer i ASP.. og det virker også i Visual Basic..
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:22 #8
tubber> Hun skrev "Jeg definere prodgr som variant"... så jeg tror at du har brugt:
dim prodgr as variant
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 20:23 #9
Det vil den heller ikke...den siger stadig fejl ved for y = 0 to ubound(prodgr)...
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:24 #10
Hvilken fejl får du?
Avatar billede tubber Juniormester
05. maj 2005 - 20:32 #11
Ja men for at få en range på den ubound skal det så ikke være

Dim prodgr(x to y) as variant ?
Dim prodgr(x) as variant
eller bare
dim prodgr(x to y)
dim prodgr(x)

Ellers er det jo ikke et array ?
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:34 #12
Hvis man bruger noget = split(noget, delimiter), bliver "noget" til en array.. og man behøver ikke en range..
Avatar billede tubber Juniormester
05. maj 2005 - 20:46 #13
Nej ok :)

Men kan UBound så finde ud af det hvis prodgr ikke har en (x) efter sig ?
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 20:48 #14
Den siger subscribt out of range...
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:49 #15
Så skal du bruge: for y = 0 to ubound(prodgr) - 1

Læg mærke til " - 1"..
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 20:51 #16
det vil den heller ikke...
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:55 #17
Prøv det her inden For-next løkken: msgbox ubound(prodgr)

Får du en fejl? Hvis ja, hvilken fejl?
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:57 #18
Jeg tør vædde med, at det er "variant/ReDim Preserve prodgr(j)"-metoder går fejlen..

Prøv indlægget 05/05-2005 20:19:26 i stedet..
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 20:58 #19
Det er prøvet og det virker heller ikke...
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:58 #20
Du kunne også prøve, at sætte et breakpoint på FOR-linien, og derefter "steppe" (mener at det er F8 man skal trykke på) igennem koden..
Avatar billede thesurfer Nybegynder
05. maj 2005 - 20:59 #21
Har du muligheden for at uploade hele koden til en server, så vi kan downloade den, og teste?
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:02 #22
Hmmm...det tror jeg nu ikke lige jeg kan finde ud af... Men jeg kan kopier den herind eller sende en mail...
Avatar billede thesurfer Nybegynder
05. maj 2005 - 21:03 #23
Hvis det ikke fylder så meget, kan du indsætte det her..
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:04 #24
Tja...det fylder da lidt, men her kommer det:

Option Explicit

Option Base 1

Sub TrimmeMain()

Dim rapportland As String, samland As String
Dim ciffer As Integer
Dim prodgr() As Variant, prodgr2() As Variant, årstal() As Variant, årstal2() As Variant

Call datanavn(rapportland, samland)
Call cifferniveau(ciffer)
Call trimdata(rapportland, samland, ciffer, prodgr(), årstal(), prodgr2(), årstal2())

'close workbooks

End Sub


Sub datanavn(rapportland As String, samland As String)

Do
Do
rapportland = InputBox("Indtast rapportland: " & vbCrLf & vbCrLf & "Danmark = dnk" & vbCrLf & _
            "Tyskland = deu" & vbCrLf & "Sverige = swe" & vbCrLf & "Portugal = prt" & _
            vbCrLf & "Østrig = aut", "RAPPORTLAND", "dnk")
Loop Until rapportland = "dnk" Or rapportland = "swe" Or rapportland = "prt" Or rapportland = "aut" _
            Or rapportland = "deu"

Do
samland = InputBox("Indtast samhandelsland: " & vbCrLf & vbCrLf & "Danmark = dnk" & vbCrLf & _
            "Tyskland = deu" & vbCrLf & "Sverige = swe" & vbCrLf & "Portugal = prt" & _
            vbCrLf & "Østrig = aut", "SAMHANDELSLAND", "swe")
Loop Until samland = "dnk" Or samland = "swe" Or samland = "prt" Or samland = "aut" Or samland = "deu"

If rapportland = samland Then
    MsgBox "Du skal vælge to forskellige lande!"
End If
Loop Until rapportland <> samland
   
End Sub

Sub trimdata(rapportland As String, samland As String, ciffer As Integer, prodgr() As Variant, årstal() As Variant, prodgr2() As Variant, årstal2() As Variant)


Dim filnavn1 As String
Dim antalgr As Integer
Dim sti1 As String
Dim i As Integer, j As Integer
Dim cifftæller As Integer
Dim celleindhold As String, indhold1 As String, indhold2 As String
Dim tæller As Integer
Dim x As Integer, y As Integer


filnavn1 = rapportland & samland & "xv"
sti1 = filnavn1 & ".wk1"

Workbooks.Open Filename:="C:\HA\Videregående EDB\datasættet\" & sti1

With Workbooks(sti1).Worksheets(filnavn1).Range("A8")
    antalgr = Range(.Offset(0, 0), .End(xlDown)).Rows.Count
   
    For i = 1 To antalgr
        cifftæller = 0
            celleindhold = .Offset(i, 0)
            indhold1 = Left(celleindhold, 2)
            indhold2 = Mid(celleindhold, 3, 2)
           
            For tæller = 1 To 7
                If Mid(celleindhold, tæller, 1) <> 32 Then
                cifftæller = cifftæller + 1
                End If
            Next tæller
    If cifftæller = ciffer Then
        If indhold1 > 27 And indhold1 < 97 Then
            If ciffer = 2 Or indhold2 <> "99" Then
                j = j + 1
                ReDim Preserve prodgr(j)
                prodgr(j) = .Offset(i, 0).Value
               
                ReDim Preserve årstal(9, j)
                    For x = 1 To 9
                        If .Offset(i, x).Value = "-" Then
                            årstal(x, j) = 0
                        Else
                            årstal(x, j) = .Offset(i, x).Value
                        End If
                    Next x
            End If
        End If
    End If
Next i
End With

Dim filnavn2 As String
Dim sti2 As String
Dim j2 As Integer

filnavn2 = rapportland & samland & "mv"
sti2 = filnavn2 & ".wk1"

Workbooks.Open Filename:="C:\HA\Videregående EDB\datasættet\" & sti2

j2 = 0
With Workbooks(sti2).Worksheets(filnavn2).Range("A8")
   
    For i = 1 To antalgr
        cifftæller = 0
            celleindhold = .Offset(i, 0)
            indhold1 = Left(celleindhold, 2)
            indhold2 = Mid(celleindhold, 3, 2)
           
            For tæller = 1 To 7
                If Mid(celleindhold, tæller, 1) <> 32 Then
                cifftæller = cifftæller + 1
            End If
        Next tæller
    If cifftæller = ciffer Then
        If indhold1 >= 28 And indhold1 <= 96 Then
            If ciffer = 2 Or indhold2 <> "99" Then
                j = j + 1
                ReDim Preserve prodgr2(j2)
                prodgr2(j) = .Offset(i, 0).Value
               
                ReDim Preserve årstal2(9, j2)
                    For x = 1 To 9
                        If .Offset(i, x).Value = "-" Then
                            årstal2(x, j2) = 0
                        Else
                            årstal2(x, j2) = .Offset(i, x).Value
                        End If
                    Next x
            End If
        End If
    End If
Next i
End With

Call samledata(rapportland, samland, ciffer, prodgr(), prodgr2(), årstal(), årstal2())

End Sub
Sub cifferniveau(ciff As Integer)

Do
ciff = InputBox("Hvilket detaljeringsniveau ønskes beregningen i?" & vbCrLf & vbCrLf & _
            "Indtast 2 for 2. cifferniveau dvs. fx. 01" & vbCrLf & _
            "Indtast 4 for 4. cifferniveau dvs. fx. 0101" & vbCrLf & _
            "Indtast 6 for 6. cifferniveau dvs. fx. 010101", _
            "DETALJERINGSNIVEAU", "2")
           
If ciff = 2 Or ciff = 4 Or ciff = 6 Then
    MsgBox "Der uddrages data på " & ciff & ". cifferniveau."
Else
    MsgBox "Cifferniveauet er ikke gyldigt. Indtast enten 2, 4 eller 6!"
End If

Loop Until ciff = 2 Or ciff = 4 Or ciff = 6

End Sub


Sub samledata(rapportland As String, samland As String, ciffer As Integer, prodgr() As Variant, prodgr2() As Variant, årstal() As Variant, årstal2() As Variant)

Dim x, y, z As Variant

Workbooks.Add
ActiveWorkbook.Worksheets("Ark1").Name = "Import"
With ActiveWorkbook.Worksheets("Import").Range("A3")

For x = 1 To 9
    MsgBox UBound(prodgr)
    .Offset(0, x) = "199" & x - 1
Next x


For y = 1 To UBound(prodgr)
    .Offset(y, 0).Value = prodgr(y)
   
    For z = 1 To 9
       
        .Offset(y, z).Value = årstal(z, y)
    Next z
Next y
End With

'For x = 1 To UBound(beskrivelse)
'.Offset(x, 0).Value = beskrivelse(x)
'For i = 1 To 9
'.Offset(x, i).Value = aartal(i, x)
'Next i
'Next x
'End With

ActiveWorkbook.Worksheets("Ark2").Name = "Eksport"
With ActiveWorkbook.Worksheets("Eksport").Range("A3")

For x = 1 To 9
    .Offset(0, x) = "199" & x - 1
Next x

For y = 1 To UBound(prodgr2)
    .Offset(y, 0).Value = prodgr2(y)
    For z = 1 To 9
        .Offset(y, z).Value = årstal2(z, y)
    Next z
Next y
End With

ActiveWorkbook.SaveAs Filename:="C:\HA\Videregående EDB\" & rapportland & samland & ciffer & ".xls"

Workbooks(rapportland & samland & ciffer).Close

End Sub
Avatar billede helmet Nybegynder
05. maj 2005 - 21:08 #25
Hvis den ikke komme ind i if'en hvor du redimmer prodgr, så vil den være tom når du kommer til for løkken, hvilket vil give fejlen du beskriver.
Avatar billede thesurfer Nybegynder
05. maj 2005 - 21:10 #26
Ahh... prodgr er ikke sat til noget fra start :-)
Så kan det godt passe :-)
Avatar billede thesurfer Nybegynder
05. maj 2005 - 21:11 #27
lotte_pigen_> Fik du egentligt nogen fejl, ved test af indlæg 05/05-2005 20:55:35 ?
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:13 #28
Til helmet: ok hvad er det for en if du taler om...er det den ved: If ciff = 2 Or ciff = 4 Or ciff = 6 Then
    MsgBox "Der uddrages data på " & ciff & ". cifferniveau."
Else
    MsgBox "Cifferniveauet er ikke gyldigt. Indtast enten 2, 4 eller 6!"
End If

og hvad skal jeg gøre?

Til Thesurfer:  ja ved indlægget ændrede det ikke noget...og hvad skal jeg sætte prodgr til? For samme problem kommer vel også ved næste uBound-sætning....
Avatar billede thesurfer Nybegynder
05. maj 2005 - 21:18 #29
Start med at sætte den til 0, hvis muligt: prodgr = 0

Så vil den lave en løkke fra 0 og til 0, hvilket betyder, at den hopper ud med det samme, da slutningen (0) er nået..
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:21 #30
så siger den: can't assign to array
Avatar billede helmet Nybegynder
05. maj 2005 - 21:23 #31
Ja, det er heller ikke rigtigt, for 0 to 0 det vil give et gennemløb i for løkken

Den skal herind, ellers fejler den.
If cifftæller = ciffer Then
        If indhold1 >= 28 And indhold1 <= 96 Then
            If ciffer = 2 Or indhold2 <> "99" Then
Avatar billede thesurfer Nybegynder
05. maj 2005 - 21:24 #32
OK, så bruge min metode..

Dvs:
1) lad være med at bruge "as variant"
2) prodgr = prodgr & ... & ";"
3) prodgr = left(prodgr, len(prodgr) -1)
4) prodgr = split(prodgr, ";")
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:28 #33
til helmet:  hvordan får jeg den til at gå ind i if'en?
Avatar billede thesurfer Nybegynder
05. maj 2005 - 21:30 #34
For at den går ind i if'en, skal den opfylde kravene, som if'erne stiller..
dvs, indhold1 skal ligge imellem 28 og 96 osv..
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:33 #35
Men det er kun produkterne imellem 28 og 96 jeg skal have ind i en ny fil så skal den da også kun tage dem der opfylder kravet eller hvad?
Avatar billede thesurfer Nybegynder
05. maj 2005 - 21:35 #36
Ja.. men der er 3 if sætninger, og de skal alle opfyldes, før der sker noget med prodgr..
Hvis det aldrig sker, vil prodgr altid være tom..
Avatar billede helmet Nybegynder
05. maj 2005 - 21:37 #37
Ja, det nemmeste for dig vil nok være og gøre som thesurfer foreslog tidligere og redimme prodgr til 0 tidligere i koden, men samtidigt lave en if omkring for løkken hvor prodgr bruger i din samledata funktion

if ubound(prodgr) > 0 then
For y = 1 To UBound(prodgr)
    .Offset(y, 0).Value = prodgr(y)
   
    For z = 1 To 9
       
        .Offset(y, z).Value = årstal(z, y)
    Next z
Next y
end if
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:40 #38
ok jeg er ikke for spids til det her programmering så jeg vil gerne have det skåret ud i pap...kan i ændre i det jeg har skrevet og sætte det herind?
Avatar billede thesurfer Nybegynder
05. maj 2005 - 21:45 #39
lotte_pigen_> helmet har bare indsæt et "check", så den ikke løber ind i For-Next løkken, hvis prodgr ikke indeholder noget:

if ubound(prodgr) > 0 then

helmet> Man skal altid start ved 0 (for y = 0..) når man arbejder med arrays.. ellers skal man bruge " - 1" visse steder..
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:49 #40
ok så har jeg sat det ind men den brokker sig stadig ved den linie der hele tiden har været bøvl med
Avatar billede thesurfer Nybegynder
05. maj 2005 - 21:54 #41
Jeg må nok hellere hoppe ud af det spørgsmålet, da jeg ikke er vant til VBA..
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:55 #42
ok men 1000 tak for hjælpen :)
Avatar billede helmet Nybegynder
05. maj 2005 - 21:56 #43
Har du i din trimmemain indsat?
redim prodgr(0)
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 21:57 #44
jeps det har jeg...
Avatar billede helmet Nybegynder
05. maj 2005 - 22:01 #45
Hmm, det er ikke msgbox ubound(prodgr)i samledata du får fejl på nu, kan se du har sat den ind siden det aller første eksempel?
Avatar billede lotte_pigen_ Nybegynder
05. maj 2005 - 22:02 #46
den har jeg slettet igen...
Avatar billede helmet Nybegynder
05. maj 2005 - 22:09 #47
Nåh, kan se man ikke må redim 0 i vba, kommer lige med et anden løsning. To minutter.
Avatar billede helmet Nybegynder
05. maj 2005 - 22:14 #48
Hvis du så fjerner den redim prodgr(0) i trimmemain, og ændrer det nederste af din kode, så den ser således ud. Har lavet en funktion TomtArray, der finder ud af om dine array er tomme, hvis de er det springer vi udenom for løkkerne som kunne få subscript out of range

Sub samledata(rapportland As String, samland As String, ciffer As Integer, prodgr() As Variant, prodgr2() As Variant, årstal() As Variant, årstal2() As Variant)

Dim x, y, z As Variant

Workbooks.Add
ActiveWorkbook.Worksheets("Ark1").Name = "Import"
With ActiveWorkbook.Worksheets("Import").Range("A3")

For x = 1 To 9
    .Offset(0, x) = "199" & x - 1
Next x

If Not TomtArray(prodgr) Then
For y = 1 To UBound(prodgr)
    .Offset(y, 0).Value = prodgr(y)
   
    For z = 1 To 9
       
        .Offset(y, z).Value = årstal(z, y)
    Next z
Next y
End If
End With

'For x = 1 To UBound(beskrivelse)
'.Offset(x, 0).Value = beskrivelse(x)
'For i = 1 To 9
'.Offset(x, i).Value = aartal(i, x)
'Next i
'Next x
'End With

ActiveWorkbook.Worksheets("Ark2").Name = "Eksport"
With ActiveWorkbook.Worksheets("Eksport").Range("A3")

For x = 1 To 9
    .Offset(0, x) = "199" & x - 1
Next x

If Not TomtArray(prodgr2) Then
For y = 1 To UBound(prodgr2)
    .Offset(y, 0).Value = prodgr2(y)
    For z = 1 To 9
        .Offset(y, z).Value = årstal2(z, y)
    Next z
Next y
End If
End With

ActiveWorkbook.SaveAs Filename:="C:\HA\Videregående EDB\" & rapportland & samland & ciffer & ".xls"

Workbooks(rapportland & samland & ciffer).Close

End Sub

Function TomtArray(test() As Variant)
    On Error GoTo tomt
   
    If UBound(test) > 0 Then
        TomtArray = False
    End If
    Exit Function
tomt:
    TomtArray = True
End Function
Avatar billede lotte_pigen_ Nybegynder
06. maj 2005 - 12:09 #49
Nu virker det....1000 tak for hjælpen :)
Avatar billede thesurfer Nybegynder
15. juni 2005 - 21:11 #50
Så skal helmet vel smide et svar..?

/theSurfer
Avatar billede helmet Nybegynder
30. november 2006 - 10:41 #51
Et svar så da.. Bedre sent end aldrig?
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
Kurser inden for grundlæggende programmering

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