06-22-2010 02:06 AM
Hallo Rednaxela,
machbar ist das alles.
Du kannst aus DIAdem heraus direkt eine Excel Datei erstellen. Dabei hast du aber nicht die Möglichkeit selektiv - also nur bestimmte Kanäle - zu speichern.
Du kannst aber auch über die OLE-Schnittstelle Daten an Excel übertragen - dann auch selektiv. Beispiel: "Clientbetrieb von DIAdem mit Excel als Server".
Du kannst aber auch eine TDM Datei erstellen und diese direkt in Excel laden. Mit DIAdem wird das Excel-Add-In installiert. Auf Rechnenrn, auf denen kein DIAdem läuft, kann das Add-In aber nachträglich installiert werden. Hier st der Link zum kostenlosen Excel-Add-In (http://zone.ni.com/devzone/cda/tut/p/id/7526).
Gruß
Walter
06-22-2010 04:14 PM
Hi Walter,
danke für den Tipp mit dem Beispiel "Clientbetrieb von DIAdem mit Excel als Server"! Ist aber (noch) etwas zu kompliziert für mich, versteh das Beispiel ehrlich gesagt nicht so ganz! Wie gesagt, arbeite jetzt seit einer Woche mit DIAdem und hatte vorher auch keine Erfahrung mit vbs!
----
Ich realisiere den Excel-Export bis jetzt so:
Dim Antwort
Antwort = msgbox("Excel-Export der Ergebnisse gewünscht?", vbYesNo)
if Antwort = vbYes then
'Excel export
EXCELChnCount=16
ExcelExpChn(1)=5
ExcelExpChn(2)=6
ExcelExpChn(3)=7
ExcelExpChn(4)=8
ExcelExpChn(5)=9
ExcelExpChn(6)=10
ExcelExpChn(7)=11
ExcelExpChn(8)=12
ExcelExpChn(9)=13
ExcelExpChn(10)=14
ExcelExpChn(11)=15
ExcelExpChn(12)=16
ExcelExpChn(13)=17
ExcelExpChn(14)=18
ExcelExpChn(15)=19
ExcelExpChn(16)=20
Call EXCELExport(AutoActPath & "Excel-Exporte\Versuchsergebnisse.xls", , 0, AutoActPath & "Excel-Exporte\vorlage.stp")
Else
MsgBox "Das Script wurde beendet!"
AutoQuit()
End If
Das klappt soweit!
Nur, wie bekomm ich jetzt noch hin, dass beim Speichern in "Versuchsergebnisse.xls" jedesmal ein neues Tabellenblatt erstellt wird und zwar mit einem Namen, der sich aus zuvor eingegebenen Variablen zusammen setzt?
Die Variablen sind:
Call GlobalDim("d, p, fz, re, Vc, TVnr, Z, FS")
d = 12
p = 0.5
fz = 0.1
re = 0.4
Vc = 200
TVnr = 1
Z = 1
FS = "test"
Name des Tabellenblatts könnte im Script so lauten:
&FS&"_TV"&TVnr&"_radius"&re&
So, dass in der Excel-Datei das Tabellenblatt dann so heißt:
test_TV1_radius0.4
Laut DIAdem-Hilfe kann man unter...
ExcelExport(EXCELFile, EXCELSheet, EXCELDlgFlag, EXCELConfigFile)
...den Namen des Tabellenblatts eingeben... aber das klappt irgendwie nicht...?
Grüße und danke!
06-24-2010 01:15 AM
Hallo Rednaxela,
das Beispiel Expl_OLE.VBS im DIAdem-Example-Verzeichnis beschreibt genau die Kommunikation. Um eine neue Seite in Excel anzulegen, benötigt man den entsprechenden Excel-Befehl. Wenn du mit DIAdem 11.1 arbeitetst, kannst du dir, zur Erleichterung, beim Scripten die Type-Library für Excel aktivieren (SCRIPT->Script->Komponenten-Bibliotheken...), dann werden dir die Excel-Befehle und -Methoden durch die Code-Vervollständigung (Punkt-Syntax) angeboten.
Im Beispiel: Excel.Workbooks(DiademExcelWorkbook).Sheets.Add(...)
Gruß
Walter
06-30-2010 09:32 AM
Hey!
DANKE! Nach langem Versuchen und Rumprobieren klappt alles mit OLE! Wirklich super!
Noch eine letzte Kleinigkeit:
Am Ende meines Scripts will ich die aktuelle "Default-Datei" im Datenportal abspeichern. Ich benutze folgenden Code, welcher auch funktioniert!
Dim Speichern1
Speichern1 = msgbox("Die aktuell im Datenportal verwendete Datei abspeichern unter ...\Auswertung\ ?", vbYesNo)
if Speichern1 = vbYes then
'Speichert den gesamten Datenbestand des DIAdem-Datenportals mit den zugehörigen Eigenschaften in einer Datendatei.
Call DATAFILESAVE(AutoActPath & "\Auswertung\ & TEST & "_TV" & TVnr & "_fz" & fz &".tdm", "TDM")
else
AutoQuit()
end If
06-30-2010 10:06 AM
UPDATE:
Hab das letzte Problem soeben gelöst 🙂 Folgender Code:
Dim Speichern1
Dim Gruppenname1
Gruppenname1 = ChnPropGet("[1]/Fv", "sourcedatafilename")
Speichern1 = msgbox("Die aktuell im Datenportal verwendete Datei abspeichern unter ...\Auswertung\ ?", vbYesNo)
if Speichern1 = vbYes then
Call DATAFILESAVE(AutoActPath & "\Auswertung\" & Gruppenname1 & "_TV" & TVnr & "_fz" & fz & ".tdm", "TDM") 'Speichert den gesamten Datenbestand des DIAdem-Datenportals mit den zugehörigen Eigenschaften in einer Datendatei.
else
AutoQuit()
end If
Nur leider gibt er als Dateiname dann Folgendes aus:
"sp_kraft2_vc200_fvar_r04_p05_1.TDM_TV1.1_fz0,1.tdm"
Geht es auch so, dass "TDM" in der Mitte weggelassen wird? Also, dass "tdm" ausschließlich am Ende steht?
Grüße!
06-30-2010 12:31 PM
Gerade ist mir noch was in den Weg gekommen:
oExcel.ActiveWorkbook.SaveAs(AutoActPath & "\Auswertung\" & Gruppenname & ".xls")
Kannst mir jemand sagen, wieso das so nicht funktioniert? Es kommt die Meldung:
111 19:08:04 Fehler:
Fehler in <Main4.VBS> (Zeile: 464, Spalte: 50):
Auf die Datei konnte nicht zugegriffen werden. Versuchen Sie die folgenden Lösungsvorschläge:
• Überprüfen Sie, ob der angegebene Ordner vorhanden ist.
• Stellen Sie sicher, dass der Ordner, in dem sich die Datei befindet, nicht schreibgeschützt ist.
• Vergewissern Sie sich, dass der Dateiname keines der folgenden Zeichen enthält: < > ? [ ] : | oder *
• Der Dateiname darf nicht länger als 218 Zeichen sein.
--> Ordner ist vorhanden!
--> Kein Schreibschutz!
--> Keines der Zeichen entahlten!
--> Name ist nicht zu lang!
Wenn ich es wie folgt mache, geht es:
oExcel.ActiveWorkbook.SaveAs("C:\Dokumente und Einstellungen\Administrator\Desktop\Script Alex Selfmade\Auswertung\" & Gruppenname & ".xls")
Woran liegt das, was mache ich falsch?
Gruß,
Alex
07-01-2010 01:35 AM
Hallo Rednaxela
Das ist eine Fehlermeldung aus dem Excel nicht aus DIAdem. Das Problem sind doppelte "\\" im Pfad. Da ist Excel "empfindlicher" als DIAdem. Die Pfade in DIAdem wie AutoActpath enden alle mit "\". Dazu kommt das "\" in "\Auswertung\".
Die Zeile sollte funktionieren.
oExcel.ActiveWorkbook.SaveAs(AutoActPath & "Auswertung\" & Gruppenname & ".xls")
Winfried
07-01-2010 04:07 AM
Hey Winfried! Danke für den Tipp! Funktioniert so!
Stoße immer wieder auf neue Sachen:
1)
Über folgenden Zeilen in meinem Script füge ich Kurven in ein 2D-Diagramm ein:
' add channels
Call AddChannels(oTopArea, "", "[1]/Fv", "Black")
Call AddChannels(oTopArea, "", "[1]/Fvn", "Blue")
Call AddChannels(oTopArea, "", "[1]/Fz", "Green")
Call AddChannels(oTopArea, "", "[1]/Result XY", "Red")
'-------------------------------------------------------------------------------
' add channel pair
'-------------------------------------------------------------------------------
Sub AddChannels(oArea, iCh1, iCh2, sColor)
Dim oCurrDispObj
' create display object
Set oCurrDispObj = oArea.DisplayObj
' add two new channel pairs given by the parameters iCh1 and iCh2
Call oCurrDispObj.Curves.Add(iCh1, iCh2)
' set color
oCurrDispObj.Curves(1).color = sColor
End Sub
Irgendwie macht DIAdem die Farben trotzdem so, wie es sie will!? Ich seh den Fehler nicht!
2)
Beim Excel-Export übertrage ich bspw. den Kanal "[1]/CopyYFv" in eine Spalte! Kann ich den max und min Wert dieser Spalte markieren, z.B. mit rot und blau? Mein Excel-Export-Code:
Call DataMatrixToExcel()
'-------------------------------------------------------------------------------
' DataMatrixToExcel
' Diese Prozedur uebertraegt die Daten aus der Datenmatrix an Excel.
' Dazu wird Excel als Apllikation gestartet und die Daten werden über die
' Active-X Schnittstelle von Excel übertragen
'-------------------------------------------------------------------------------
Sub DataMatrixToExcel
Dim oExcel,oWorkbookT,oSheetT,iChannelT,lFirstDataRowT,lChnCountT,lLengthT,lProzent, iIndex1, iIndex2
'-------------------------------------------------
' Excel als Applikation starten :
'-------------------------------------------------
Set oExcel = CreateObject("Excel.Application")
' Erste Zeile mit Daten :
lFirstDataRowT = 6
'-------------------------------------------------
' Neues Woorkbook und Sheet in Excel anlegen :
'-------------------------------------------------
Set oWorkbookT = oExcel.Workbooks.Add()
'Sheet in Excel anlegen
Set oSheetT = oWorkbookT.Sheets.Add
' Kanaele zaehlen
lChnCountT = 0
For iChannelT = 1 To ChnNoMax
if ( 0 >= Len(ChnName(iChannelT)) ) Then Exit For
lChnCountT = lChnCountT + 1
Next
' Namen des Tabellenblatts setzen in das die DIAdem-Daten eingetragen werden
oSheetT.Name = "TV" & TVnr & "_fz" & fz
'-------------------------------------------------
' Informationen aus dem Kanalheader uebertragen :
'-------------------------------------------------
For iChannelT = 1 To lChnCountT
oSheetT.Cells(1, iChannelT) = ChnName(iChannelT)
oSheetT.Cells(2, iChannelT) = ChnComment(iChannelT)
oSheetT.Cells(3, iChannelT) = ChnDim(iChannelT)
oSheetT.Cells(4, iChannelT) = ChnLength(iChannelT)
' Noch was fuers Auge ....
oSheetT.Cells(5, iChannelT).Interior.ColorIndex = 48
oSheetT.Columns(iChannelT).AutoFit
Next
'-------------------------------------------------
' Kanaldaten übertragen
'-------------------------------------------------
For iChannelT = 5 To lChnCountT
Call LoopInit()
Call MsgLineDisp("Übertragung des Kanals '"&ChnName(iChannelT)&"' ("&CStr(ChnLength(iChannelT))&" Werte)")
' ----- ist ein NV-Wert im Kanal ?
if ucase(ChnNovKey(iChannelT)) = "YES" then
For iIndex1 = 1 To ChnLength(iChannelT)
oSheetT.Cells(lFirstDataRowT+iIndex1-1, iChannelT) = GetValue(iIndex1,iChannelT)
lProzent = (iIndex1*100)/ChnLength(iChannelT)
If ( 0 = (lProzent Mod 5 ) ) Then Call LoopInc(lProzent)
Next
else
For iIndex2 = 1 To ChnLength(iChannelT)
oSheetT.Cells(lFirstDataRowT+iIndex2-1, iChannelT) = GetValueX(iIndex2,iChannelT)
lProzent = (iIndex2*100)/ChnLength(iChannelT)
If ( 0 = (lProzent Mod 5 ) ) Then Call LoopInc(lProzent)
Next
end if
Call LoopDeInit()
Next
' Excel anzeigen
oExcel.Visible = true
If MsgBox("Excel schließen?", vbYesNo Or vbQuestion, "Bestätigen") = vbYes Then
' Save actual Excel-Workbook
oExcel.ActiveWorkbook.SaveAs(AutoActPath & "Auswertung\" & Gruppenname & ".xls")
' In VBS, Excel must be closed explicitly.
oExcel.Quit
Else
' Save actual Excel-Workbook
oExcel.ActiveWorkbook.SaveAs(AutoActPath & "Auswertung\" & Gruppenname & ".xls")
End If
' Set object references to 'Nothing'.
Set oSheetT = Nothing
Set oExcel = Nothing
End Sub
' ----- holt Werte und prüft nicht auf NV
function GetValueX(iIdxT, iChnT)
GetValueX = CHD(iIdxT,iChnT)
end function
' ----- holt Werte und prüft auf NV
function GetValue(iIdxT, iChnT)
dim vVal
vVal = CHD(iIdxT,iChnT)
if IsNull(vVal) then
GetValue = "Novalue"
else
GetValue = vVal
end if
end function
Gruß
07-01-2010 04:36 AM
Hallo Rednaxela
Punkt 1 ist schnell erklärt. Du setzt immer die Farbe der ersten Kurve.
Ändere den Code etwas ab. Curves.add liefert ja die erstellte Kurve als Objekt zurück. Das Objekt kannst du dann nehmen und verändern.
Sub AddChannels(oArea, iCh1, iCh2, sColor)
Dim oCurrDispObj
' create display object
Set oCurrDispObj = oArea.DisplayObj
' add two new channel pairs given by the parameters iCh1 and iCh2
Dim oNewCurve
set oNewCurve = oCurrDispObj.Curves.Add(iCh1, iCh2)
' set color
oNewCurve.color = sColor
End Sub
Gruß Winfried
07-01-2010 05:04 AM
Hi Winfried!
Wow, das geht aber schnell hier! Super, somit wäre auch Punkt1 geklärt! Vielen, vielen Dank!
Bleibt noch Punkt2! Aber, ich denke, der ist etwas schwieriger zu lösen...?
Grüße,
Alex