18.04.2016, 21:07 (Dieser Beitrag wurde zuletzt bearbeitet: 19.04.2016, 12:03 von Rabe.)
Hallo Andre,
vielen Dank für Deinen Vorschlag, das klappt sehr gut! Ich nehme an, wenn ich eine andere Klasse als IFCQUANTITYAREA auslesen möchte ändere ich einfach diesen Eintrag!? Werden bei deinem Code derzeit alle vorhandenen Elemente dieses Typs ausgelesen? Wie würde der Code aussehen, wenn ich gerne zwei Klassen gleichzeitig auslesen möchte? Kann im Code zusätzlich fixiert werden, dass die auszulesende Datei im selben Verzeichnis wie das Excel Dokument liegt, wodurch nach Start des Makros diese IFC Datei ohne erneute Auswahl ausgelesen wird?
ja, für andere Einträge gibst Du etwas anderes an. Du musst nur auf die Schreibweise achten, im Beispiel alles in groß. Wenn Du zwei Klassen gleichzeitig holen willst, dann z.B. mit zwei Suchworten
... Dim strSearch1$, strSearch2$ ... strSearch1 = "ABC" strSearch2 = "DEF" ... If InStr(strLine, strSearch1) > 0 Or InStr(strLine, strSearch2) > 0 Then ...
Das mit dem Verzeichnis und dem Dateinamen geht auch, allerdings müsste dann der Dateiname immer gleich sein. Die Zeile mit Open sähe dann so aus:
... Open Thisworkbook.Path & "\Meine.IFC" For Input As #1 ...
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
das mit dem Auslesen auch von mehreren Kategorien klappt gut. Für die weitere Bearbeitung der Daten hätte ich folgende Fragen (siehe Exceldatei als Anlage):
- In den ausgelesenen Klassen gibt es jeweils eine Spalte, deren Inhalt relevant ist, bei IFCSPACE ist es jeweils der Inhalt der Spalte F, bei IFCQUANTITYAREA der Inhalt der Spalte J. Kann das Einlesen der Daten auf diese Spalten beschränkt werden?
- Kann die Formatierung der Spalte F und Spalte J bereits im Code angepasst werden? Wie im Beispieldokument ersichtlich wird bei Spalte J in Zelle J7 der Buchstaben ü nicht richtig dargestellt (der Eintrag sollte "Küche" heißen) In Spalte F gibt es das Problem bei den Zahlenwerten, die teilweise durch Punkt und teilweise durch Komma getrennt werden (bei Betrachtung der IFC Datei im IFC Viewer werden die Zahlenwerte immer korrekt mit Komma in der IFC Datei dargestellt). Eine genaue Zahlenangabe ist nur mit Komma möglich.
- Wie können Merkmale die den Klassen untergliedert sind angesprochen werden, z.B. IfcQuantityArea - GrossFloorArea Die Zahlenwerte der GrossFloorArea wären für mich wichtige Zahlenwerte, die ich gerne aus der IFC Datei auslesen möchte.
in der IFC werden die deutschen Umlaute durch solche Zeichenketten ersetzt. Hast Du da eine Übersicht? Da kann ich das Ersetzen programmieren. ü wird ja eventuell nicht reichen.
Für die "Spalten" müsstest Du genau definieren, der wievielte Wert bei einer Klasse relevant ist. Ich könnte das jetzt für die zwei tun, aber dann fragst Du alle zwei Stunden nach der nächsten Klasse... ? Auch hier wäre eine Übersicht nicht schlecht.
Dass das mit dem GrossFloorArea müsstest Du genauer beschreiben. Als Wort findet man das ja nicht in der IFC. Es wird vielleicht in der Zeile nach IfcQuantityArea beginnen? Aber wo hört es auf?
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
21.04.2016, 13:03 (Dieser Beitrag wurde zuletzt bearbeitet: 21.04.2016, 15:31 von Rabe.
Bearbeitungsgrund: Font, Farbe und Size "small" entfernt => bessere Lesbarkeit
)
Hallo Andre,
vielen Dank für Deine Info! Für das Ersetzen der Umlaute gibt es folgende Zeichenfolgen: ö entspricht in IFC der Zeichenfolge \X2\00D6\X0\ - ü entspricht in IFC der Zeichenfolge \X2\00DC\X0\ - ä entspricht in IFC der Zeichenfolge \X2\00C4\X0\ Es wäre sehr hilfreich, wenn Du in einem Makro das Ersetzen dieser Zeichenfolgen durch die Umlaute einbauen könntest.
Wenn es möglich wäre, das Einlesen der Werte auf gewisse Spalten zu reduzieren, wäre das natürlich gut für mich, beispielhaft anhand von IFCSPACE (=Spalte F) und IFCQUANTITYAREA (Spalte J) den Code zu sehen. Die Anpassung an andere Werte kann ich dann auf Basis dieses Codes selbst durchführen.
Das Problem mit IFC ist, das diese Struktur auf die Programmiersprache EXPRESS hin angepaßt ist. Dabei hat lt. Klassendefinition im Web "GrossFloorArea" einen Zusammenhang mit "IfcQuantityArea". Nun weiß ich nicht, wie ich diesen Wert mit VBA Code auslesen kann (exemplarisch für weitere Werte). Der Zusammenhang dieses Werts ist unter folgender URL beschrieben: http://www.buildingsmart-tech.org/ifc/IF...ilding.htm
anbei der neue Code. Die Daten aus F und J werden jetzt in Spalte C eingetragen. Ist das GrossFloorArea eventuell die Summe der einzelnen Zahlen, die der Code übernimmt? Dann brächte man ja nur in Spalte C unten die Summe oder deren Formel einzutragen.
Sub IFC_Einlesen()
'Variablendeklaration 'String Dim strLine$, strCutter$, arrText, strSearch1$, strSearch2$
'Integer Dim iCol%
'Long Dim lStart&
'Dateneintrag ab Zeile 1
lStart = 1'Suchwort, ggf. per Inputbox
strSearch1 = "IFCQUANTITYAREA"
strSearch2 = "IFCSPACE"'Datei Oeffnen mit Dialog Open Datei_Dialog ForInputAs #1
'Schleife bis Dateiende DoWhileNot EOF(1)
'Zeile einlesen LineInput #1, strLine
'nur importieren wenn strSearch vorhanden 'ggf. Großschreibung verarbeiten If InStr(strLine, strSearch1) > 0Or InStr(strLine, strSearch2) > 0Then'Klammer und Semikolon am Ende abtrennen
strLine = Left(strLine, Len(strLine) - 2)
'Umlaute ersetzen
strReplace strLine
'Trennzeichen =
strCutter = "="'Zeilennummer abtrennen
arrText = Split(strLine, strCutter)
'Zeilennummer in Spalte A = 1 eintragen
Cells(lStart, 1) = arrText(0)
'Trennzeichen (
strCutter = "("'Suchwort abtrennen
arrText = Split(arrText(1), strCutter)
'Suchwort in Spalte B = 2 eintragen
Cells(lStart, 2) = Trim(arrText(0))
'zu uebernehmende "Spalte" je nach Suchwort festlegen 'bea: Array faengt mit Index 0 an If Trim(arrText(0)) = strSearch1 Then iCol = 3Else iCol = 7'Trennzeichen ,
strCutter = ","'Resttext aufteilen
arrText = Split(arrText(1), strCutter)
'Resttext in Spalte C eintragen With Cells(lStart, 3)
'Resttext eintragen
.Value = arrText(iCol)
'Punkt durch Komma ersetzen 'Hinweis: wegen englichem VBA Punkt durch Punkt
.Replace What:=".", Replacement:="."'Ende Mit dem Bereich ab Spalte C EndWith'Zeile 1 erhöhen
lStart = lStart + 1'Ende nur importieren wenn strSearch vorhanden EndIf'Ende Schleife bis Dateiende Loop'Datei schließen. Close #1
EndSubPrivateSub strReplace(ByRef strText AsString)
'deutsche Umlaute ersetzen 'ae
strText = Replace(strText, "\X2\00C4\X0\", "ä")
'ue
strText = Replace(strText, "\X2\00D6\X0\", "ö")
'oe
strText = Replace(strText, "\X2\00FC\X0\", "ü")
EndSub
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
21.04.2016, 22:48 (Dieser Beitrag wurde zuletzt bearbeitet: 22.04.2016, 11:43 von Rabe.
Bearbeitungsgrund: Font, Farbe und Size "small" entfernt => bessere Lesbarkeit
)
Hallo Andre,
vielen Dank für Deinen Code! Eine kleine Ergänzung wäre noch gut, nämlich dass beide Werte in einer eigenen Spalte stehen, eigentlich so wie in Deinem aktuellen Code aber in eigenen Spalten nebeneinander (nicht in derselben Spalte untereinander). Leider ist GrossFloorArea nicht die Summe der einzelnen Zahlen, die bereits ausgelesen werden. Diese Werte sind wieder in eigenen Klassen gespeichert.
vielen Dank nochmals für Deinen Code! Eine kleine Ergänzung Deines zuletzt bearbeiteten Codes wäre noch gut, nämlich dass beide Werte in einer eigenen Spalte stehen. Vielleicht kannst Du mir kurz anhand dem Beispiel beschreiben, wie das z.B. bei drei oder vier Klassen angepasst werden müsste.