Ich führe SQL in Excel mit ADO in Excel-VBA aus. Und die Ergebnisse werden auf einem Excel-Arbeitsblatt angezeigt.Das SQL-Ergebnis ist wegen falscher SQL-Datumsvergleichseinstellung ungenau.
Es gibt ein Feld Datum in Arbeitsblatt 2014,2015,2016,2017
die Daten Beispiel genannt ist: 2/1/2014,7/1/2014,23/10/2014
dieses Feld Datentyp ist in Tag/Monat/Jahr. Und Datum wird kombiniert durch = DATUM (Zelle1, Zelle2, Zelle3) -Jahr, Monat, Tag. Das Datum in Tabellen sollte allesamt ein reines Datum sein, da ich 3 Zellen (Jahr, Monat, Datum) kombiniere) in 1-Feld (Datum)
'Dim two date variables
Dim fromDate As Date
Dim toDate As Date
'Dim 4 integer variables
Dim fromyear As Integer
Dim toyear As Integer
Dim frommonth As Integer
Dim ToMonth As Integer
'add combobox value
With FromYearC
.AddItem 2014
.AddItem 2015
.AddItem 2016
.AddItem 2017
End With
'add combobox value
With FromMonthC
.AddItem 1
.AddItem 2
.AddItem 3
.AddItem 4
.AddItem 5
.AddItem 6
.AddItem 7
.AddItem 8
.AddItem 9
.AddItem 10
.AddItem 11
.AddItem 12
End With
'Store combo box value into these 4 integer variables
fromyear = FromYearC.Value
frommonth = FromMonthC.Value
toyear = ToYearC.Value
ToMonth = ToMonthC.Value
'Now i want to combine these variables and store into fromDate and toDate
fromDate = DateSerial(fromyear, frommonth, 1)
toDate = DateSerial(toyear, ToMonth + 1, 1)
'it is still wrong , no matter orginal date format or new date format"dd/mm/yyyy"
fromDate = Format(fromDate, "dd/mm/yyyy")
toDate = Format(toDate, "dd/mm/yyyy")
VBA Benutzeroberfläche: Jetzt möchte ich den Datumsbereich zwischen from und todate setzen (beide inklusive)
ich die SQL-Referenz bauen zu: How to combine 3 VBA variable into date datatype in VBA
' This is the new SQL string
WHERE date >= #" & fromdate & "# AND date<#" & toDate & "#"
Problem:
Nun ist die SQL-Ergebnis ist völlig falsch (habe noch ausgegeben). Ich denke, die SQL Where-Klausel hat etwas falsch. Da das SQL ursprünglich richtig ist, ist die SQL falsch mit der where-date Auswahlklausel.
Oder ich habe versucht, where-between-Klausel zu verwenden. Das ist immer noch falsch.
date between #" & fromDate & "# and #" & toDate & "#
Die vollständige SQL ist hier, aber ich denke, es ist zu lang
SELECT officer ,NULL, SUM(IIF(isnumeric(mkt) = true and Survey='CPI' and Activity='FI' and Outcome= 'C', Totalmin, 0)/468) , SUM(IIF(isnumeric(Non) = true and Survey='CPI' and Activity='FI' and Outcome= 'C', Totalmin, 0)/468) ,NULL ,NULL , IIF(ISNULL(sum(mkt)),0,sum(mkt)),Sum(Non),sum(ICP),(sum(mkt)+Sum(Non)+sum(ICP)) ,NULL,NULL,NULL,count(IIF(Survey='CPI' and Activity='FI' ,Totalmin, NULL)),NULL,count(IIF( Survey='CPI' and Activity='FI' and (Outcome ='C' OR Outcome='D'OR Outcome='O') , Totalmin, NULL)),NULL,SUM(IIF(Survey='CPI' and Activity='FI' ,Totalmin, 0)),NULL,SUM(IIF(Survey='CPI' and Activity='FI' and (Outcome ='C' OR Outcome='D') ,Totalmin, 0)) From (select officer ,rank ,year ,month ,day , survey ,activity ,outcome ,mkt,non,totalmin,ICP ,date from [2014$] UNION ALL select officer ,rank ,year ,month ,day , survey ,activity ,outcome ,mkt,non,totalmin,ICP ,date from [2015$] UNION ALL select officer ,rank ,year ,month ,day , survey ,activity ,outcome ,mkt,non,totalmin,ICP ,date from
[2016$] UNION ALL select officer ,rank ,year ,month ,day , survey ,activity ,outcome ,mkt,non,totalmin,ICP ,date from [2017$])as table3 where officer is not null and officer <> '' and officer <> ' ' and date >= #" & fromDate & "# AND date<#" & toDate & "#" group by officer
Update
Ich versuche hart Code zu verwenden
and date >= #1-3-2016# AND date<#31-3-2016#
die SQL zu testen.
Es schlägt wie das ursprüngliche SQL fehl. Es kann die Ergebnisse ausgeben, aber das Ergebnis ist falsch.
Ich denke, ist es mit der UNION ALL verbunden? Als ich alle 4 Tabellen Datensätze zu einem großen Tisch zu verbinden.
Update 2
Ich glaube es ist nicht auf UNION ALL verwendet. Da das Excel-Spalte-Datum in 3 Zellen kombiniert ist - Jahr, Monat, Tag, ich kopiere und füge den Wert erneut. Die SQL-Ergebnisse haben Änderungen. Allerdings ist das Ergebnis immer noch falsch.
Dann habe ich versucht, harten Code zu testen. Zum Beispiel versuche ich auf 2016. März den Datensatz wählen Sie diese Klausel, wo Verwendung:
and month=3 and year=2016
Es ist OKAY.
Dann habe ich versucht, diese Where-Anweisung unten zu verwenden. Das ist nicht OKAY.
date >= #2016-03-01# AND date<#2016-04-01#
dann glaube ich es das Datum Datentyp Problem entweder in Excel oder VBA sein sollte.
Dann habe ich versucht, unter diese Tests zu tun:
Für Excel, der ursprünglichen Datentyp Datum Zeichenfolge ändern .i, numerisch, allgemeinen ... Nicht in Ordnung
Datum Beispiel: 6/1/2016 Zeichenkette Beispiel: 42375 numerisches Beispiel: 42375.00
Für VBA versuchte ich, den Monat und den Tag zu tauschen. -> # 2016-01-03 # Immer noch nicht OK
Wie lautet Ihr Regionsdatum? TT/MM/JJJJ oder MM/TT/JJJJ? – Jules
@Jules das Datum in Excel ist TT/MM/JJJJ. Ich ändere für die VBA-Date-Variable in TT/MM/JJJJ. Es ist aber immer noch falsch. 'fromDate = Format (fromDate," TT/MM/JJJJ ") toDate = Format (toDate," TT/MM/JJJJ ")' – Monchhichi
Warum verwenden Sie 'date' als Spaltennamen? – KyloRen