Avatar billede janvogt Praktikant
22. december 2003 - 11:49 Der er 8 kommentarer og
1 løsning

VBA Fra database til formular

Jeg sætter endnu engang fast i min banko VBA-kode :-)

Jeg har et ark "Database" med 30 kolonner og x antal rækker dannet ud fra nedenstående kode.

På et andet ark "Udskrift" har jeg en formular, som skal udfyldes udfra data fra databasen.

Brugeren skal kunne vælge, hvor mange plader (fra 1 til 4) der skal udskrives på hvert ark.
D.v.s. at hvis der f.eks. der 30 poster(bankoplader) i databasen, og brugeren vælger 3 plader pr. udskriftsside, så skal der udskrives 10 sider.

Jeg har foreløbigt eksperimenteret mig frem til følgende:

Sub udskrift()
    Dim A4 As Integer
    A4 = 0
    PerArk = 0
   
    CountArea = Worksheets("Database").Range("A:A")
    AntalPlader = Application.WorksheetFunction.CountA(CountArea) - 1
   
PerArk:
    PerArk = InputBox("Hvor mange plader skal der være på hvert A4-ark?", "Antal plader pr. ark", 2)
    If PerArk > 4 Or PerArk < 1 Then
        MsgBox "Antal plader pr. A4-ark skal være mellem 1 og 4"
        GoTo PerArk
    End If
    A4 = Round(AntalPlader / PerArk)
    If A4 * PerArk < AntalPlader Then A4 = A4 + 1
    'Worksheets("database").Select
    'Range("A2:AD" & AntalPlader + 1).Select
    'For g = 1 To A4
    'For h = 1 To PerArk
    'For i = 1 to 3  Opdeles i 3 etaper, da hver plade indeholder 3 rækker
   
    'Next i
    'Next h
    'Indsæt sluttekst
    'Print
    'Next g
End Sub

Den første plade skal nok først starte i række 5, da der på hver side skal være plads til en "header".

Mellem hver plade (som består at 3 rækker á 9 celler) skal der vel være 3 blanke rækker.

Kontrolcifferet skal højrespilles under hver plade.

Håber der er en (Kabbak?) som kan hjælpe ....
Avatar billede janvogt Praktikant
22. december 2003 - 11:51 #1
Her er selve koden, som danner databasearket:

Public Sub BingoPladerTilBase()
Dim C(3) As Variant, UU(3) As Integer, X As Variant, U As Integer, I As Integer, Lille As Variant, Stor As Variant
Dim Rcount(2) As Integer, Kol(8) As Integer
Dim Plade(2, 8) As Variant, Base() As Variant

Randomize
Columns("A:AF").ClearContents
BlankFeltTekst = "BANKO"  ' ret blank felt tekst her
Q = InputBox("Hvor mange plader skal der genereres?", "Antal plader", 1)
ReDim Base(Q, 29)

'**************************************** Overskrifter ********************
I = 2  'Afgør hvilken kolonne Række/Kolonne overskrifterne skal starte

Base(0, 0) = "Kontrol"
Base(0, 1) = "Navn"
Base(0, 2) = "Opslag"

    For R = 1 To 3
        For K = 1 To 9
            I = I + 1
            Base(0, I) = "R" & R & "K" & K ' indsætter overskrifter
        Next
    Next
'**************************************** Overskrifter  slut ********************

    Lille = Array(1, 10, 20, 30, 40, 50, 60, 70, 80) ' mindste værdier
    Stor = Array(9, 19, 29, 39, 49, 59, 69, 79, 90)  ' største værdier
   
    R = 0
    T = 0
   
  For ny = 1 To Q

    '****************************** Tilpasser Antal på pladen ****************
    ' De 4 fordelingsmuligheder har forskellige sandsynligheder
    ' De kan placeres på 1554 forskellige måder
   
  Ford = Int(Rnd * 1554) + 1 ' Random fordeling
  If Ford < 84 + 756 + 630 + 84 Then A = 4
  If Ford < 84 + 756 + 630 Then A = 3
  If Ford < 84 + 756 Then A = 2
  If Ford < 84 Then A = 1
   
  Select Case A
    Case 1
    R1 = Array(3, 3, 3, 1, 1, 1, 1, 1, 1)
    Case 2
    R1 = Array(3, 3, 2, 2, 1, 1, 1, 1, 1)
    Case 3
    R1 = Array(3, 2, 2, 2, 2, 1, 1, 1, 1)
    Case 4
    R1 = Array(2, 2, 2, 2, 2, 2, 1, 1, 1)
  End Select
    '****************************** Blanding  start ****************
    For T = 0 To 8 ' 9 kolonner
KOL1:
      UK = Int(Rnd * 9) + 1 'tilfældig placering på Kolonner
  Kol(T) = UK - 1
    For Y = 0 To T - 1
      If Kol(Y) = UK - 1 Then GoTo KOL1
    Next Y
Next T
    '****************************** Blanding ****************
   
For T = 0 To 8 ' 9 kolonner

    For I = 0 To 2 ' antal rækker
   
Start1:
      U = Int(Rnd * 3) + 1 'tilfældig placering på række
  UU(I) = U
    For Y = 0 To I - 1
      If UU(Y) = U Then GoTo Start1
    Next Y
Start2:
        X = Int((Rnd() * (Stor(T) - Lille(T) + 1) + Lille(T)))
          If U > R1(Kol(T)) Then
                    Plade(I, R) = BlankFeltTekst  ' bart felt
          GoTo BarFelt
        End If
 
  For Y = 0 To I - 1
      If C(Y) = X Then GoTo Start2
    Next Y
  C(Y) = X
  Plade(I, R) = X
 
BarFelt:
  Next I
  R = R + 1
Next T
    '**************************** sortering 5 i hver række **************
TjekIgen:

For I = 0 To 2
Rcount(I) = 0
For j = 0 To 8
If IsNumeric(Plade(I, j)) Then
  Rcount(I) = Rcount(I) + 1
End If
Next
Next
    If Rcount(0) < 5 And Rcount(1) > 5 Then Fra = 1: til = 0: GoTo FlytPlads
    If Rcount(0) < 5 And Rcount(2) > 5 Then Fra = 2: til = 0: GoTo FlytPlads
    If Rcount(1) < 5 And Rcount(0) > 5 Then Fra = 0: til = 1: GoTo FlytPlads
    If Rcount(1) < 5 And Rcount(2) > 5 Then Fra = 2: til = 1: GoTo FlytPlads
    If Rcount(2) < 5 And Rcount(0) > 5 Then Fra = 0: til = 2: GoTo FlytPlads
    If Rcount(2) < 5 And Rcount(1) > 5 Then Fra = 1: til = 2: GoTo FlytPlads
  GoTo AltOk
 
FlytPlads:
  For Iv = 0 To 8
    If IsNumeric(Plade(Fra, Iv)) Then  ' rækken med mere end 5
      If Plade(til, Iv) = BlankFeltTekst Then  'rækken med mindre end 5 og skal være blank
      Plade(til, Iv) = Plade(Fra, Iv)  ' flytter række
      Plade(Fra, Iv) = BlankFeltTekst    ' skriver blank tekst
      GoTo TjekIgen
      End If
  End If
  Next
GoTo TjekIgen
'**************************** sortering lodret stigende **************
AltOk:
For v = 0 To 8
  For I = 0 To 2
  If Plade(I, v) = BlankFeltTekst Then GoTo Tekst1
 
    For Iv = 0 To 1
    If Plade(Iv, v) = BlankFeltTekst Then GoTo Tekst2
      If Plade(I, v) < Plade(Iv, v) Then
        temp = Plade(I, v)
      Plade(I, v) = Plade(Iv, v)
      Plade(Iv, v) = temp
    End If
Tekst2:
    Next Iv
Tekst1:
  Next I
  Next
 
'**************************** sortering slut **************
Base(ny, 0) = ny + 100      'Kontrolciffer
   
    For I = 1 To 9
        Base(ny, I + 2) = Plade(0, I - 1)
    Next
   
    For I = 10 To 18
        Base(ny, I + 2) = Plade(1, I - 10)
    Next
   
    For I = 19 To 27
        Base(ny, I + 2) = Plade(2, I - 19)
    Next
    'Base(ny,30)=xxx    'Indsætter beregningsformel efter arket - husk at Q skal ændres
  R = 0
Next ny

Range(Cells(1, 1), Cells(Q + 1, 30)) = Base
End Sub
Avatar billede kabbak Professor
22. december 2003 - 14:16 #2
Et forsøg, men uden formatering af celler

Sub udskrift()
    Dim A4 As Integer, Start As Integer, AntalPlader As Integer, Base As Variant
    A4 = 0
    PerArk = 0
  AntalPlader = Worksheets("Database").Range("A65536").End(xlUp).Row - 1
     
PerArk:
    PerArk = InputBox("Hvor mange plader skal der være på hvert A4-ark?", "Antal plader pr. ark", 2)
    If PerArk > 4 Or PerArk < 1 Then
        MsgBox "Antal plader pr. A4-ark skal være mellem 1 og 4"
        GoTo PerArk
    End If
    A4 = Round(AntalPlader / PerArk)
    If A4 * PerArk < AntalPlader Then A4 = A4 + 1
    Base = Worksheets("database").Range("A2:AD" & AntalPlader)
   
    Worksheets("Udskrift").Cells.Delete Shift:=xlUp
    Start = 6
    For g = 1 To A4 Step PerArk
    For h = 0 To PerArk - 1
  ' Opdeles i 3 etaper, da hver plade indeholder 3 rækker
    For I = 1 To 9
        Worksheets("Udskrift").Cells(Start, I) = Base(g + h, I + 3)
    Next
    For I = 10 To 18
      Worksheets("Udskrift").Cells(Start + 1, I - 9) = Base(g + h, I + 3)
    Next
    For I = 19 To 27
      Worksheets("Udskrift").Cells(Start + 2, I - 18) = Base(g + h, I + 3)
    Next
      Worksheets("Udskrift").Cells(Start + 3, 8) = "Kontrol"
      Worksheets("Udskrift").Cells(Start + 3, 9) = Base(g + h, 1)
    Start = Start + 7
    Next h
  ' Indsæt sluttekst Udskrift
  ' Print
  Worksheets("Udskrift").Rows(Start).Select
    ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
  Start = Start + 5
    Next g
End Sub
Avatar billede janvogt Praktikant
22. december 2003 - 16:11 #3
Takker kabbak.
Der er dog en eller anden fejl i tælleren.
Den får ikke alle poster med.
G-løkken skal vel bare steppe 1? Men der må også være noget andet galt.
Avatar billede janvogt Praktikant
22. december 2003 - 16:15 #4
Hvordan med en evt. formatering.
Bare en tynd streg om alle celler med indhold samt mulighed for at køre de "blanke" felter i en anden skriftstørrelse.
Det var ikke en del af det oprindelige spørgsmål, så jeg forhøjer pointene lidt.
Avatar billede kabbak Professor
22. december 2003 - 16:23 #5
Sub udskrift()
    Dim A4 As Integer, Start As Integer, AntalPlader As Integer, Base As Variant
    A4 = 0
    PerArk = 0
  AntalPlader = Worksheets("Database").Range("A65536").End(xlUp).Row - 1
     
PerArk:
    PerArk = InputBox("Hvor mange plader skal der være på hvert A4-ark?", "Antal plader pr. ark", 2)
    If PerArk > 4 Or PerArk < 1 Then
        MsgBox "Antal plader pr. A4-ark skal være mellem 1 og 4"
        GoTo PerArk
    End If
    Base = Worksheets("database").Range("A2:AD" & AntalPlader + 1)
   
    Worksheets("Udskrift").Cells.Delete Shift:=xlUp
    Start = 6
    For G = 1 To AntalPlader Step PerArk
    For h = 0 To PerArk - 1
  ' Opdeles i 3 etaper, da hver plade indeholder 3 rækker
    For I = 1 To 9
        Worksheets("Udskrift").Cells(Start, I) = Base(G + h, I + 3)
    Next
    For I = 10 To 18
      Worksheets("Udskrift").Cells(Start + 1, I - 9) = Base(G + h, I + 3)
    Next
    For I = 19 To 27
      Worksheets("Udskrift").Cells(Start + 2, I - 18) = Base(G + h, I + 3)
    Next
      Worksheets("Udskrift").Cells(Start + 3, 8) = "Kontrol"
      Worksheets("Udskrift").Cells(Start + 3, 9) = Base(G + h, 1)
    Start = Start + 7
    If G + (h + 1) > AntalPlader Then Exit Sub
   
    Next h
  ' Indsæt sluttekst Udskrift
  ' Print
  Worksheets("Udskrift").Rows(Start).Select
    ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
  Start = Start + 5
    Next G
End Sub


rettet
Avatar billede kabbak Professor
22. december 2003 - 16:40 #6
med formatering af celler

Sub udskrift()
    Dim A4 As Integer, Start As Integer, AntalPlader As Integer, Base As Variant
    A4 = 0
    PerArk = 0
    StorSkrift = 30 'Maks 30
    LilleSkrift = 8
  AntalPlader = Worksheets("Database").Range("A65536").End(xlUp).Row - 1
     
PerArk:
    PerArk = InputBox("Hvor mange plader skal der være på hvert A4-ark?", "Antal plader pr. ark", 2)
    If PerArk > 4 Or PerArk < 1 Then
        MsgBox "Antal plader pr. A4-ark skal være mellem 1 og 4"
        GoTo PerArk
    End If
    Application.ScreenUpdating = False
    Base = Worksheets("database").Range("A2:AD" & AntalPlader + 1)
    Worksheets("Udskrift").Cells.Delete Shift:=xlUp
    Start = 6
    For G = 1 To AntalPlader Step PerArk
    For h = 0 To PerArk - 1
  ' Opdeles i 3 etaper, da hver plade indeholder 3 rækker
    For I = 1 To 9
        Worksheets("Udskrift").Cells(Start, I) = Base(G + h, I + 3)
    Next
    For I = 10 To 18
      Worksheets("Udskrift").Cells(Start + 1, I - 9) = Base(G + h, I + 3)
    Next
    For I = 19 To 27
      Worksheets("Udskrift").Cells(Start + 2, I - 18) = Base(G + h, I + 3)
    Next
      Worksheets("Udskrift").Cells(Start + 3, 8) = "Kontrol"
      Worksheets("Udskrift").Cells(Start + 3, 9) = Base(G + h, 1)
      Range(Cells(Start, 1), Cells(Start + 2, 9)).Select
      Selection.Borders.LineStyle = xlContinuous
            With Selection
          .HorizontalAlignment = xlCenter
          .VerticalAlignment = xlCenter
        End With
        For Each C In Selection
        If IsNumeric(C) Then
        C.Font.Size = StorSkrift
        Else
          C.Font.Size = LilleSkrift
        End If
        Next
    Start = Start + 7
    If G + (h + 1) > AntalPlader Then GoTo Slut
        Next h
  ' Indsæt sluttekst Udskrift
  ' Print
  Worksheets("Udskrift").Rows(Start).Select
    ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell
  Start = Start + 5
    Next G
Slut:
Application.ScreenUpdating = True
End Sub
Avatar billede janvogt Praktikant
22. december 2003 - 17:03 #7
Præcis!
Smid et svar.
Avatar billede kabbak Professor
22. december 2003 - 17:04 #8
et svar
Avatar billede janvogt Praktikant
22. december 2003 - 17:29 #9
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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