Avatar billede puppetmaster Nybegynder
07. marts 2005 - 10:12 Der er 8 kommentarer og
1 løsning

Overføre dataområde til SQL Server

Jeg har langt om længe fundet frem til en kode som kan overføre fra Excel til SQL Server, men det er ikke videre skalérbart, da jeg overfører cellerefererede områder til tabellen.

r = 7 ' Første række i regnearket
Do While Len(Range("C" & r).Formula) > 0
  With rs
    .AddNew
    .Fields("Dato") = Worksheets("Ark1").Range("ProdDate").Value
    .Fields("Linie nr") = Worksheets("Ark2").Range("C" & r).Value
    .Fields("Art") = Worksheets("Ark2").Range("D" & r).Value
    .Fields("Str") = Worksheets("Ark2").Range("E" & r).Value
    .Fields("Type") = Worksheets("Ark2").Range("F" & r).Value
    .Update  End With
  r = r + 1
Loop

Områden fra C7 til F36 har et navn (Indsæt -> Navn -> Definer...) som er Data.
Er det muligt at omskrive koden, så hvis der f.eks. kommer en kolonne på, så slipper jeg for at skulle redigere i koden? Noget med at overføre hele området Data til tabellen i SQL server.
Avatar billede puppetmaster Nybegynder
07. marts 2005 - 11:40 #1
Hvis det er muligt at overføre et helt dataområde i et hug, kan jeg jo kalde funktionen med navnet på arket/dataområdet, samt navnet på tabellen, som dataene skal sættes ind i...
Avatar billede bak Forsker
07. marts 2005 - 14:47 #2
Det tror jeg ikke man kan. jeg mener at det er nødt til at være record by record.
Hvis du vil lave koden flexibel, hvordan skal den så vide hvad feltet (det nye) hedder ?
Står det i headeren på excels liste eller.. ?
Avatar billede puppetmaster Nybegynder
07. marts 2005 - 15:03 #3
Well, regnearket dataområde, Data, består af 21 kolonner og 30 rækker.
Den første række i dataområdet indeholder overskrifter på kolonnerne.
Jeg tænkte nok det ikke bare var lige til... :(
Avatar billede puppetmaster Nybegynder
07. marts 2005 - 15:15 #4
Koden bliver også værre og værre:

r = 7 'Start i række 7, som er første datarække (række 6 er kolonneoverskrifter)
Do While r < 37 'Check at der kun læses fra de første 30 rækker
  Do While Worksheets("Ark2").Range("C" & r).Value = "" 'Hvis nøglefeltet er tomt, skal der navigeres til den næste række
    r = r + 1
    If r > 36 Then 'Hvis vi er nået forbi den sidste række, skal Sub'en stoppes
      Exit Sub
    End If
  Loop
    With rs
      .AddNew
      .Fields("Dato") = Worksheets("Ark1").Range("ProdDate").Value
      .Fields("Linie nr") = Worksheets("Ark2").Range("C" & r).Value
      .Fields("Art") = Worksheets("Ark2").Range("D" & r).Value
      .Fields("Str") = Worksheets("Ark2").Range("E" & r).Value
      .Fields("Type") = Worksheets("Ark2").Range("F" & r).Value
      .Update  End With
    r = r + 1
  Loop

Jeg ville meget gerne have reviewet koden, hvis det ikke kan lade sig gøre at overføre et helt dataområde på en gang, så jeg kan vise brugeren en "Alt ok!" besked, når Sub'en er kørt, hvilket ikke lader sig gøre pga. disse linier:
If r > 36 Then
  Exit Sub
End If

Hvordan skal det så se ud?
Avatar billede bak Forsker
07. marts 2005 - 16:04 #5
well, test det her

    Dim dataarea As Range
    Dim dataheaders As Variant
    'sæt dataarea = data
    Set dataarea = Sheets("Ark2").Range("data")
    'find headerne
    dataheaders = dataarea.Resize(1, dataarea.Columns.Count)
    'sæt dataarea = alt under headerne
    Set dataarea = dataarea.Offset(1, 0).Resize(dataarea.Rows.Count - 1, dataarea.Columns.Count)
    'for hver række i dataarea
    For Each r In dataarea.Rows
        'hvis nøglefeltet er udfyldt så...
        If dataarea(r, 1) <> "" Then

            With rs
                .AddNew
                .fields("Dato") = Worksheets("Ark1").Range("ProdDate").Value
                'for hver header indsæt værdien fra rækken
                For x = 1 To UBound(dataheaders, 2)
                    .fields(dataheaders(1, x)) = dataarea(r, x)
                Next
                .Update
            End With
        Else
            'ellers kom med en besked
            dataarea(r, 1).Select
            MsgBox "ikke udfyldt"
        End If
    Next
Avatar billede puppetmaster Nybegynder
08. marts 2005 - 08:48 #6
Hmmm....hvad skal r være dimensioneret som?
Har prøvet med Variant og Object, men det virker, koden går i stå her:

For Each r In dataarea.Rows
Avatar billede puppetmaster Nybegynder
08. marts 2005 - 09:02 #7
Sorry, jeg får en Type mismatch fejl i linien
If dataarea(r, 1) Is Null Then

når r er dimensioneret enten som en Variant eller Object.
:(
Avatar billede puppetmaster Nybegynder
08. marts 2005 - 11:35 #8
Har ændret lidt på koden og nu virker den.

    For r = 1 To dataarea.Rows.Count
        If dataarea(r, 1) <> 0 Then
            With rs
                .AddNew
                .Fields("Dato") = Worksheets(ark2).Range(range2).Value
                For x = 1 To UBound(dataheaders, 2)
                    .Fields(dataheaders(1, x)) = dataarea(r, x)
                Next
                .Update
            End With
        End If
    Next

Takker for hjælpen, læg et svar, så jeg kan tildele dig nogle point.
Avatar billede bak Forsker
08. marts 2005 - 11:57 #9
velbekomme
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

IT-JOB