![]() |
Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Hallo zusammen,
ich muss eine Exceldatei 2010 auslesen. In dieser Exceldatei sind Textfelder, keine Textboxen, im Bereich einzelner bestimmten Zellen positioniert. Wie bekomme ich über VBA raus, ob sich ein Textfeld im Bereich dieser Zelle befindet ? Edit: ![]() |
AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Hast du es mal mit dem Format versucht?
Gruß K-H |
AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Mit welchem Format ? Ich habe nicht so viel Erfahrung in VBA.
|
AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Über das folgende Makro kann ich ermitteln, welches Textfeld in welcher Zelle ist : (Quelle aus dem Crosspost)
Code:
Jetzt ist nur noch die Frage, wie bringe ich dieses Makro rüber nach Delphi, dass ich die Werte in Delphi ermitteln und anzeigen kann ? Es sollte möglichst ohne Änderungen in den Exceldateien möglich sein.
Sub Makro1()
Dim shpe As Shape For Each shpe In ActiveSheet.Shapes Debug.Print shpe.Name If shpe.Name Like "Text Box*" Then If Not Intersect(Range("F10"), Range(shpe.TopLeftCell, shpe.BottomRightCell)) Is Nothing Then 'hier der Code, der ausgeführt werden soll, 'wenn sich eine Textbox 'im Bereich der Zelle C3 befindet. 'die Textbox kann über die Variabele "shpe" angesprochen werden MsgBox "im Bereich der Zelle F10 liegt das Textfeld " & shpe.Name End If End If Next End Sub |
AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Wenn in dem Dokument, die Textfelder wirklich nur in einer Zelle stehen, also nicht über mehrere Zellen gehen, sind shpe.TopLeftCell und shpe.BottomRightCell dasselbe, nämlich die gesuchte Zelle. Diese kannst du dir afaik auch über shpe.TopLeftCell.Adress anzeigen lassen, oder auswerten.
Dann brauchts du weder Intersect noch Range. Beides sind ja Excel-Funktionen, wo ich auch nicht wüsste, wie die bei OLE rüberkommen... |
AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Mit "Format" meine ich das Zellenformat, habe gerade kein Excel zur Hand um nach zu schauen.
Das Makro hat ja mit "Text Box" zu tun, das hattest Du doch eigentlich ausgeschlossen? Gruß K-H |
AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Zitat:
Zitat:
Edit: Zum besseren Nachvollziehen, habe ich mal einen Teil der der Spalten als Bild angehängt. Jedes kleine Rechteck ist ein Textfeld und keine Textbox. Diese Heißen alle mit Namen "Text Box xxxx". Hierbei stehen die xxxx für unterschiedliche Zahlen. |
AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Ich hab gerade mal versucht, das nachzustellen und es scheint, als wärest du weiter gekommen als ich:
Ich komme dabei noch an die Shapes-Auflistung, kann mir also per showmessage noch ws.Shapes.Count ausgeben lassen, an die Shapes komme ich dann aber schon nicht dran: ws.Shapes[i] gibt einen ungültiges Argument Fehler ws.Shapes.Item[i] gibt ein "mitglied wurde nicht gefunden" Fehler. Kann nicht am Index liegen, da ich beide Varianten (Start mit0 und mit 1 probiert habe). Mystriös. |
AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Zitat:
|
AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Liste der Anhänge anzeigen (Anzahl: 1)
Da ich hier kein Delphi habe, hab ich's gerade mal schnell mit VBA und dann in LinqPad (C#) probiert:
Code:
Dynamic entpricht Delphi's OleVariant.
var appType = Type.GetTypeFromProgID("Excel.Application");
dynamic excelApp = Activator.CreateInstance(appType); var workBook = excelApp.Workbooks.Open(@"jadajada\Excel-Controls Test.xlsx"); var msoTextBox = 12; var msOLEControlObject = 19; var activeSheet = workBook.ActiveSheet; Func<string, string> cleanCellAddress = cellAddress => cellAddress != null ? cellAddress.Replace("$", "") : null; var shapes = (from dynamic shape in (IEnumerable)activeSheet.Shapes where shape.Type == msoTextBox || (shape.Type == msOLEControlObject && shape.OLEFormat.progID.Contains("TextBox")) select new { Name = (string)shape.Name, TopLeftCell = cleanCellAddress(shape.TopLeftCell.Address as string), BottomRightCell = cleanCellAddress(shape.BottomRightCell.Address as string), AllCells = (from dynamic cell in (IEnumerable)excelApp.Range(shape.TopLeftCell, shape.BottomRightCell).Cells select cleanCellAddress(cell.Address as string)).ToList() }).ToList(); Die Funktionen, die man so freizügig in VBA nutzen kann, kann man einfach direkt auf dass Excel.Application-Objekt anwenden. (Ich nutze in dem Beispiel die Range-Funktion) Wenn ihr Textboxes haben wollt, dann könnt ihr nicht auf den Namen gehen, den kann man ändern! Es gibt einen Type bei den Shapes, der kann 12 sein (TextBox) oder 19 (Ein OLE Control das eine Textbox darstellt). Wenn 19, dann muss man die ProgId prüfen, ob es auch eine TextBox ist. Falls BottomRightCell erst in späteren Excel-Version dazukam, kann man halt nur Links-oben nutzen... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz