Avatar billede janus_007 Nybegynder
08. januar 2008 - 22:03 Der er 16 kommentarer og
1 løsning

Skriv Cellvalue til database

Hej

Jeg har brug for lidt hjælp, jeg har et DDE-link som opdateres løbende fra et andet program.

Nu ønsker jeg så at skrive celle-værdien til en database hver gang den ændrer sig.

Jeg tænker på om der ikke findes en slags onChange på cellen? En event af en art...
I behøver ikke gå i dybden med databaseconnections, det har jeg styr på, det er kun registreringen af eventen.

Og hvis det kan laves, kan jeg så være så heldig at det også kan laves asynkront?
Avatar billede kabbak Professor
08. januar 2008 - 22:11 #1
Der kan fanges i ThisWorkbook modulet, her er et eksempel.

Det gælder for Ark1 celle A1

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name = ("Ark1") And Target.Address = ("$A$1") Then
        MsgBox " Ændring"
    End If

End Sub
Avatar billede kabbak Professor
08. januar 2008 - 22:16 #2
du kan godt undvære parenteser i

If Sh.Name = ("Ark1") And Target.Address = ("$A$1") Then

det var bare gammel vane ;-))
Avatar billede janus_007 Nybegynder
08. januar 2008 - 22:25 #3
OKay...

Ved du så om jeg kan kalde en funktion asynkront til at skrive cellvalue? For vi snakker altså mange ændringer i sekundet :-)
Avatar billede kabbak Professor
08. januar 2008 - 22:33 #4
den vil fange ændringen, med det samme og udføre koden, men om den er hurtig nok til at skrive til databasen, inden den ændrer sig igen, kommer jo an på en prøve.

du sætter din kode ind, til at overføre til databasen, i stedet for denne

  MsgBox " Ændring"
Avatar billede janus_007 Nybegynder
08. januar 2008 - 22:37 #5
Jeps.. så langt er jeg med ;-) Sidder normalt og udvikler C# og MSSQL og der har man jo asynkrone function calls, men har ikke det helt vilde forstand på Excel.

Jeg vil lige teste det og så give dig point, men lige for at være helt sikker.. Ved du om Excel understøtter asynkrone kald, altså en slags background process som ikke forstyrrer arket?

/J
Avatar billede kabbak Professor
08. januar 2008 - 22:44 #6
Den burde ikke forstyrre arket, men hvis du har en anden kode der kører samtidig, kan den sløve det.
Avatar billede janus_007 Nybegynder
08. januar 2008 - 23:04 #7
Se nu har jeg problemet...

Jeg har lavet flg.:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Sh.Name = ("Sheet2") And Target.Address = ("$A$1") Then
        MsgBox " Ændring"
    End If

End Sub

Det er en engelsk version Excel jeg kører med.... anyway, jeg har på Sheet2 lavet en copy på flg. måde: =Sheet1!$A$1

Men det lader ikke til at SheetChange fanger den, det går fint hvis jeg refererer direkte til Sheet1, men det kan jeg ikke pga. DDE-linket.

Forslag ? :-)
Avatar billede kabbak Professor
08. januar 2008 - 23:09 #8
den kan ikke fange en ændring i en celle, som sker p.g.a. en formel.
Så hvis du ikke kan referere til den celle der skrives i, så kan du ikke.
Avatar billede kabbak Professor
08. januar 2008 - 23:11 #9
hvorfor kan du ikke direkte til Sheet1, den laver jo ikke noget med cellen, den ser jo bare at den er ændret. ??
Avatar billede janus_007 Nybegynder
08. januar 2008 - 23:22 #10
Jo sorry... det er jo sent om aftenen *S*, den kunne fange den fint nok.

Det er jeg super glad for, men kan du fortælle mig hvorfor Target.Address er sådan en størrelse her: "$A$1:$N$13"

Hvad laver alle de dollarstegn der?
Avatar billede kabbak Professor
08. januar 2008 - 23:33 #11
"$A$1:$N$13"
det er fordi at der er sket ændringer i alle disse celler samtidig.

Dollertegnene betyder at det er et område der er låst både på rækker og kolonner, når man bruger dem i en formel, men Target.Address tager dem med også.
Avatar billede janus_007 Nybegynder
08. januar 2008 - 23:39 #12
Okay..
Så hvis jeg skal smide celleværdierne ind i en database skal jeg iterere igennem 1 til 13 for hver SheetChange og så naturligvis i den kolonne som jeg skal lagre?

Jeg kan fortælle dig at det kører nu, funktionen er blevet kaldt ca. 20000 gange på 4 minutter, så du kan godt se der ikke er tid til at undersøge meget med for mange if's :-)
Avatar billede kabbak Professor
08. januar 2008 - 23:43 #13
det er nu 182 celler og ikke 13

øverste venstre er A1 og nederste højre er N13
Avatar billede kabbak Professor
08. januar 2008 - 23:43 #14
Skal du virkelig have alle ind i databasen ??
Avatar billede kabbak Professor
08. januar 2008 - 23:51 #15
Nå det var kun kolonne A

du kan overføre dem sådan, de læses ind i en variabel, så går det stærkere

ret selv koden til din SQL overførsel, eller hvad du nu bruger

Dim Data As Variant, I as integer
    Data = Worksheets("Ark1").Range("$A$1:$A$13")
    For i = 1 To 13
        overfør Data(i, 1) ' din overførsel til databasen
    Next
Avatar billede janus_007 Nybegynder
08. januar 2008 - 23:58 #16
Okay, lækkert man kan gøre sådan.

Nej jeg skal ikke have alle ind i db'en, kun der hvor der er ændringer ifht. sidste skrivning. Nu sidder jeg og kigger lidt på VBA, man kan jo lave normal kode, modules og classes, så kan jeg sikkert også lave noget async ADODB.

Du har været en god hjælp, læg et svar.
Avatar billede kabbak Professor
08. januar 2008 - 23:59 #17
et svar ;-))
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