AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]
Thema durchsuchen
Ansicht
Themen-Optionen

Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

Ein Thema von RWarnecke · begonnen am 28. Jul 2012 · letzter Beitrag vom 31. Jul 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 28. Jul 2012, 19:13
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: Crosspost
Rolf Warnecke
App4Mission

Geändert von RWarnecke (29. Jul 2012 um 08:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 28. Jul 2012, 21:36
Hast du es mal mit dem Format versucht?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 28. Jul 2012, 23:19
Mit welchem Format ? Ich habe nicht so viel Erfahrung in VBA.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#4

AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 29. Jul 2012, 12:11
Über das folgende Makro kann ich ermitteln, welches Textfeld in welcher Zelle ist : (Quelle aus dem Crosspost)
Code:
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
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 29. Jul 2012, 15:57
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...
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 29. Jul 2012, 17:27
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#7

AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 29. Jul 2012, 17:41
Mit "Format" meine ich das Zellenformat, habe gerade kein Excel zur Hand um nach zu schauen.
Wie soll mir das weiterhelfen, wenn das Textfeld kleiner ist als die Zelle selber ?
Das Makro hat ja mit "Text Box" zu tun, das hattest Du doch eigentlich ausgeschlossen?
Das ist auch richtig so, dass ich Text Box ausgeschlossen habe. Das Textfeld heißt nur so. In meinem VBA Beispiel prüfe ich ja nur auf den Namen ab, der halt "Text Box" heißt.

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.
TopLeftCell und BottomRightCell liefern in Delphi den Fehler:
Zitat:
---------------------------
Debugger Exception Notification
---------------------------
Project XLSTestFeld.exe raised exception class EOleError with message 'Method 'BottomRightCell' not supported by automation object'.
---------------------------
Break Continue Help
---------------------------
Wie komme ich an die Koordinaten entweder als Zahlen(6,9) oder als Zelle(F9) ran ? Gibt es noch andere Properties ? Ich habe bis jetzt keine gefunden.

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.
Miniaturansicht angehängter Grafiken
clipboard01.jpg  
Rolf Warnecke
App4Mission

Geändert von RWarnecke (29. Jul 2012 um 17:49 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 30. Jul 2012, 08:18
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.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#9

AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 30. Jul 2012, 08:48
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.
Nimm mal Range statt Item. Dann kommst Du an den Namen und an die Werte Top und Left. Mit Textframe.Characters.Text kommst Du an den Inhalt des Textfeldes.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#10

AW: Wissen welches Textfeld in welcher Zelle ist ? [VBA 2010]

  Alt 30. Jul 2012, 10:39
Da ich hier kein Delphi habe, hab ich's gerade mal schnell mit VBA und dann in LinqPad (C#) probiert:
Code:
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();
Dynamic entpricht Delphi's OleVariant.
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...
Miniaturansicht angehängter Grafiken
excel-textboxes-screenie.png  
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz