Avatar billede rickie Juniormester
11. januar 2005 - 13:23 Der er 10 kommentarer og
1 løsning

Pause i makro/opdatering af database

Hej,

Er der nogen der ved hvordan jeg laver en pause inden et makro køres?
Grunden til dette er at jeg har en automatisk opdatering af et excel-ark fra en SQL database og jeg vil gerne have at makroet først kører når databaseopdateringen er færdig. Er dette muligt?

Hvis det ikke går at gøre automatiskt er der så en mulighed for at sætte en timer ind, så at den feks køres efter 30-60 sekunder?

Her er mit makro:
Sub Auto_Open()


Streng = MsgBox("Gul:        Mindre end eller lig med 10 aktive sager!" & Chr(13) & "Grøn:      Ingen aktive sager!" & Chr(13) & "Orange:  Brev indenfor de sidste 30 dage!" & Chr(13) & "" & Chr(13) & "Husk at køre makro (ALT+F8 + ENTER) efter den automatiske opdatering!")
RW = Range("A65536").End(xlUp).Row

For i = 3 To RW

If Cells(i, 2) = 0 Or Cells(i, 3) = 0 Then
Range(Cells(i, 1), Cells(i, 16)).Interior.ColorIndex = 43
Else
Range(Cells(i, 1), Cells(i, 16)).Interior.ColorIndex = xlNone
End If

If Cells(i, 3) <= 10 Then
Range(Cells(i, 3), Cells(i, 3)).Interior.ColorIndex = 6
Else
Range(Cells(i, 3), Cells(i, 3)).Interior.ColorIndex = xlNone
End If

If Cells(i, 7) >= Date - 30 Or Cells(i, 8) >= Date - 30 Or Cells(i, 9) >= Date - 30 Or Cells(i, 10) >= Date - 30 Or Cells(i, 11) >= Date - 30 Or Cells(i, 12) >= Date - 30 Or Cells(i, 13) >= Date - 30 Or Cells(i, 14) >= Date - 30 Or Cells(i, 15) >= Date - 30 Or Cells(i, 16) >= Date - 30 Then
Range(Cells(i, 7), Cells(i, 16)).Interior.ColorIndex = 45
End If

Next

End Sub
Avatar billede martin_moth Mester
11. januar 2005 - 15:01 #1
Din macro gør da intet andet end at skifte noget farve på nogle celler - hvad har det med en opdatering af database at gøre?

Den opdatering du taler om - kan den ikke afslutte med at sætte din macro i gang - forstår ikke helt dit problem...

Nå - men det skal jeg ikke blande mig i - du spørger om pauser:

http://www.eksperten.dk/spm/Programmering/Visual-Basic/?sort=&order=DESC&status_1=on&status_2=on&status_3=on&spm_creator=&spm_part=&spm_answer=&find=pause&engine=exp

Du kan sagtens også bruge en timer
Avatar billede rickie Juniormester
11. januar 2005 - 15:30 #2
Det er en almindelig opdatering (SQL) fra en database. Selve makroet skal kun farve udfra kriterier i makron :-)

Jeg kigger på dit svar og ser hvad det giver mig!
Avatar billede martin_moth Mester
11. januar 2005 - 16:05 #3
Ja, al den kode du har givet har vel ikke noget som helst med det du spørger om at gøre.
Avatar billede rickie Juniormester
11. januar 2005 - 16:23 #4
Måske har det, måske har det ikke - det er det jeg ikke ved.

Jeg ved bare at når jeg åbner excel arket så venter databasen med at opdatere til det at makroet er eksekveret.
Jeg håbede at der var en måde at makroet kunne vente til opdateringen fra databasen var klar :-)

Jeg har også set nogle "makro" hvor selve select koden er i et makro og ikke hentes ved at imporetere data (Data/importera externa data/...svenks excel). Hvis dette går, så burde jo ovenstående kode kunne lægges efter select koden?

Måske går det slet ikke.
Avatar billede martin_moth Mester
11. januar 2005 - 17:36 #5
Jeg tror de færreste kan forstå helt hvad du laver - når du åbner excel venter databasen med at opdatere..?

Hvad bliver opdateret i databasen og hvordan?
Har databasen overhovedet noget med Excel at gøre? Hvad?
Bliver opdateringen af databasen foretaget i din macro, eller hvordan???

Du kan sagtens hente data fra en database med en macro, det troede jeg egenligt var det du gjorde.

Der er ca. 100000 måder at gøre det samme på, så det er svært at hjælpe når jeg ikke ved hvad du egenligt laver ;o)

Men at lave en pause, det har jeg da vist ;o)
Avatar billede rickie Juniormester
12. januar 2005 - 10:21 #6
Når man importerer data fra en database så bruger Excel Ms Query - det er det jeg gør.

HER ER SPØRGSMÅLET TIL DATABASEN:
select regdate,
count(distinct actno) as no,
count(distinct case when ClosureDate is null then ActNo else null end),
sum(capital) as capital,
min(actno) as [min act],
max(actno) as [max act],
min([Brev1]) as [Brev1],
min([Brev2]) as [Brev2]

from
(
SELECT CONVERT(datetime, a.RegDate, 104) as regdate,
  a.ActNo as actno,
  a.ClosureDate as ClosureDate,
  c.RegisteredCapital as capital,
  (select top 1 h.Time from nihist h(nolock) where  Action = Brev1' and h.objecttype = 1 and h.objectno = a.actno) as [Brev1],
  (select top 1 h.Time from nihist h(nolock) where  Action = 'Brev2' and h.objecttype = 1 and h.objectno = a.actno) as [Brev2]

FROM niAct a(NOLOCK), niDtMain b(NOLOCK), niDtInv c(NOLOCK)
 
WHERE
  a.ActNo = b.ActNo
  AND
  b.DebtNo = c.DebtNo
  AND
  a.CreditorNo = '139'
  AND
  a.RegDate BETWEEN '030101' and '041231'

) as tmp_table

group by regdate
order by regdate


Makroet står jo foroven.

Om du kan hjælpe mig at få både Queryn og makroet som farver cellerne i samme makro er det perfekt.

Kan godt forstå hvis du ikke gider men jeg smider ind lidt ekstra points :-)
Avatar billede martin_moth Mester
12. januar 2005 - 10:50 #7
Nå, jeg ville nu hente data direkte fra en macro, ved at connecte til databasen og sende et SQL udtryk af sted. Altså ikke bruge Excel Ms Query, som jeg ikke kender til.

Du kalder bare din macro i bunden af din opdateringskode.
Avatar billede martin_moth Mester
12. januar 2005 - 10:52 #8
Hov - din databasekode ser anderledes ud end det jeg er vant til...


Men - hvordan får du den til at opdatere - ved et kald fra en macro? I så fald, supplerer du blot med et nyt kald når den er færdig med at opdatere.

Alternativt, kan du jo lade være emd at køre din macro i Auto_Open, men selv starte den op manuelt
Avatar billede rickie Juniormester
12. januar 2005 - 13:22 #9
Nå, jeg ville nu hente data direkte fra en macro, ved at connecte til databasen og sende et SQL udtryk af sted. DET ER DETTE JEG VIL MEN JEG VED BARE IKKE HVORDAN :-)

Jeg kunne faktiskt godt starte makroet manuelt men der er ca. 20-25 brugere som ikke er gode til Excel (det er jeg jo heller ikke, men men! :-)

Hvis du kan/har lyst så må du gerne lave en connection til databasen via et makro til mig.
Du får dine points aligevel, men det havde været kanon :-)
Avatar billede martin_moth Mester
12. januar 2005 - 14:38 #10
Der er jo 100 måder at gøre de samme ting på, og når man ikke ved præcis hvad du laver, kan det være svært at hjælpe - derfor alle disse irreterende spørgsmål fra min side;-) Når du skriver "opdatere en database" kan det betyde en HEL masse vidt forskelligt :o)

Søgemaskinen er din ven:

f.eks. http://eksperten.dk/spm/512160

der er 100-vis af besvarede spørgsmål.

Princippet er:

Opret en variabel i VBA, som skal indeholde en tabel (et recordset)
Connect til databasen fra VBA vha en connectionstring

Herefter kan du f.eks.

*) Fyr en passende SQL-sætning af sted, som henter data fra databasen over i din variabel.
*) Brug dine data til hvad du vil - indsæt dem i regnearket eller hvad ved jeg
*) Opdater evt. dataene i databasen med en passende SQL

Osv.
Avatar billede rickie Juniormester
13. januar 2005 - 07:28 #11
OK! Jeg søger videre! Svar for dine points :-)
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