Seite 1 von 1

Excel - Einlesen einer Tabelle

Verfasst: Do, 21. Apr 2011 16:46
von Chris
Hallo,

also ich habe über Active X das einlesen einer Excel-Tabelle und Umwandeln in eine DBF-Datei gelöst. Jeztt habe ich allerdings ein Problem mit Zellen die Numerische Werte mit mehr als zwei Nachkommastellen haben. Wenn ich diese mit Range("XY"):Value auslese, dann erhalte ich hier einen gerundeten Wert auf zwei Nachkommastellen. Die Formatierung der Zellen steht in Excel bereits auf Numerisch mit drei Nachkommastellen, es wird auch korrekt angezeigt, nur eben beim Einlesen erhalte ich den falschen Wert.

Hat von euch jemand eine Idee wie ich Excel dazu bringe mir die Werte mit allen Nachkommastellen auszugeben?

Danke schon im Voraus.

Gruß,
Chris

Re: Excel - Einlesen einer Tabelle

Verfasst: Do, 21. Apr 2011 17:13
von Rolf Ramacher
Hi Chris.,

das habe ich bei mir so

Code: Alles auswählen

   oExcel := CreateObject("Excel.Application")
   IF Empty( oExcel )
    MsgBox( "Excel ist nicht installiert" )
    RETURN Nil
   ENDIF

   oExcel:DisplayAlerts := .F.
   oExcel:visible       := .f.

	oBook := oExcel:Workbooks:Open(cFile)
	oSheetDat := oBook:Sheets(cWork)
	oSheetDat:Select()

	oRange:=oSheetDat:Range(cVonBis)
	oRange:select()
	aExcelWerte:=oRange:Value()

	For i = 1 to Len(aExcelWerte)
		nZaehler++
		If nZaehler % 1000 == 0
			oAnzStatic:setcaption("Adressn werden gelesen:  "+aExcelwerte[i][3])
			nZaehler:=0
		Endif
		cBemerk:=""

		Do Case
			Case valtype(aExcelwerte[i][5]) = "N"
				cPlz:=alltrim(str(Int(aExcelWerte[i][5])))
			Case 	valtype(aExcelwerte[i][5]) = "C"
				cPlz:=alltrim(aExcelWerte[i][5])
		Endcase

		If cBis ="G" 
			Do Case
				Case valtype(aExcelwerte[i][7])="N"
					cIndex:=strzero(aExcelwerte[i][7],6)
				Case Valtype(aExcelWerte[i][7])="C"
					cIndex:=strzero(val(aExcelwerte[i][7]),6)
				Otherwise
					cIndex:=padr(alltrim(aExcelwerte[i][3])+alltrim(aExcelwerte[i][4])+cPlz,105)
			Endcase
		Else
			cIndex:=padr(alltrim(aExcelwerte[i][3])+alltrim(aExcelwerte[i][4])+cPlz,105)
		Endif
		If Adress->(!DbSeek(cIndex))
			Adress->(DbAppend())
			If cBis="G"	
				If Valtype(aExcelwerte[i][7])="N"
					Adress->Kdnr:=aExcelwerte[i][7]
				Else
					Adress->Kdnr:=val(alltrim(aExcelwerte[i][7]))
				Endif
			Else
				Adress->Kdnr:=nKdnr+1
			Endif
		Endif
		Do While Adress->(!Rlock())
		Enddo
		If aExcelWerte[i][1] <> NIL
			Adress->Ana:=alltrim(aExcelwerte[i][1])
		Endif
		If aExcelwerte[i][2] <> NIL
			Adress->VName:=alltrim(aExcelwerte[i][2])
		Endif
		Adress->Str:=alltrim(aExcelwerte[i][4])
		Adress->NName:=alltrim(aExcelWerte[i][3])
		If valtype(aExcelwerte[i][5]) = "N"
			Adress->Plz:=alltrim(str(Int(aExcelwerte[i][5])))
		Else
			Adress->Plz:=alltrim(aExcelWerte[i][5])
		Endif
		If aExcelWerte[i][6] <> Nil
			Adress->Ort:=alltrim(aExcelWerte[i][6])
		Endif
		If cBis="H"
			If aExcelWerte[i][8] <> NIL
				Do Case
					Case valtype(aExcelWerte[i][8]) = "C"
						cBemerk+=alltrim(aExcelWerte[i][8])
					Case valtype(aExcelWerte[i][8]) = "N"
						cBemerk+=alltrim(str(Int(aExcelWerte[i][8])))
					Otherwise
						cBemerk+=dtoc(aExcelWerte[i][8])
				Endcase
			Endif
		Endif
		If cBis="I"
			If aExcelWerte[i][9] <> NIL
				Do Case
					Case valtype(aExcelWerte[i][9]) = "C"
						cBemerk+=alltrim(aExcelWerte[i][9])
					Case valtype(aExcelWerte[i][9]) = "N"
						cBemerk+=alltrim(str(Int(aExcelWerte[i][9])))
					Otherwise
						cBemerk+=dtoc(aExcelWerte[i][9])
				Endcase
			Endif
			Adress->Bemerk:=cBemerk
		Endif
		If cBis="J"
			If aExcelWerte[i][10] <> NIL
				If valtype(aExcelWerte[i][10]) = "C"
					Adress->Tel:=alltrim(aExcelWerte[i][10])
				Else
					Adress->Tel:=alltrim(str(Int(aExcelWerte[i][10])))
				Endif
			Endif
		Endif
		If cBis="K"
			If aExcelWerte[i][11] <> NIL
				If valtype(aExcelWerte[i][11]) = "C"
					Adress->Tel2:=alltrim(aExcelWerte[i][11])
				Else
					Adress->Tel2:=alltrim(str(Int(aExcelWerte[i][11])))
				Endif
			Endif
		Endif
		Adress->(DbUnlock())
		nKdnr++
	Next i
Hierbei werden Adressen eingelesen. Vielleicht hilft es dir

Re: Excel - Einlesen einer Tabelle

Verfasst: Do, 21. Apr 2011 18:04
von Wolfgang Ciriack
Hallo Rolf,
tue und doch bitte den Gefallen, und lies dir vor einer Antwort mal die Frage genau durch. Ich weiss natürlich nicht, ob deine Adressen irgendwo 3 Nachkommastellen haben :roll:

Re: Excel - Einlesen einer Tabelle

Verfasst: Do, 21. Apr 2011 18:17
von Koverhage
Hallo Chris,

wie lautet Deine Anweisung zur Sortierung und wann machst Du die ?

Re: Excel - Einlesen einer Tabelle

Verfasst: Do, 21. Apr 2011 18:20
von Koverhage
bei mir lautet die z.B.

// Liefermenge
oSheet:Cells(nRow,2):Value := strtran(ltrim(str(l_menge)),".",",")
oSheet:Cells(nRow,2):NumberFormat := "#0,000"
oSheet:Cells(nRow,2):HorizontalAlignment = xlRight

Re: Excel - Einlesen einer Tabelle

Verfasst: Do, 21. Apr 2011 20:30
von Chris
Hallo,
danke erstmal für eure Antworten. Inzwischen hab ich mein Problem aber lösen können. Es lag an der Einstellung von

Code: Alles auswählen

SET DECIMALS TO
mit

Code: Alles auswählen

SET(_SET_DECIMALS)
hat diese 2 zurückgegeben. Nachdem ich es auf

Code: Alles auswählen

SET(_SET_DECIMALS, 4)
gesetzt habe, habe ich auch die richtigen Werte aus Excel zurückbekommen.

Re: Excel - Einlesen einer Tabelle

Verfasst: Sa, 23. Apr 2011 10:04
von Koverhage
Hallo Chris,

laut Doku ist dies nur für die Anzeige im Xbase++ Programm, dürfte so mit nicht die Ursache sein.
Werde das aber mal ausprobieren, wenn es so ist, könnte es für
ein bestimmtes Problem sehr hilfreich sein.

Re: Excel - Einlesen einer Tabelle

Verfasst: Sa, 23. Apr 2011 20:24
von AUGE_OHR
Koverhage hat geschrieben:laut Doku ist dies nur für die Anzeige im Xbase++ Programm, dürfte so mit nicht die Ursache sein.
Ich kann bestätigen das es für alle activeX Verbindungen gilt die ich bislang ausprobiert habe.
wenn man, mittels DispHpr.DLL und Ot4Xb, einen "Zeit" String mit Dezimal Stellen YYYYMMDDHHMMSS.ccc erhalten möchte muss man

Code: Alles auswählen

SET DECIMALS TO 4
setzen