| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | |  | PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
|
Autor
|
Thema: Exceldatei erweitern (2104 mal gelesen)
|
InesP Mitglied

 Beiträge: 66 Registriert: 23.08.2004 Win XP AutoCAD 2004 Office 2000
|
erstellt am: 04. Dez. 2006 22:01 <-- editieren / zitieren --> Unities abgeben:         
Hallo, ich steh mal wieder auf dem Schlauch. Ich habe eine UserForm mit Textfeld. Den in dieses Feld eigetragenen Text sende ich an eine Exceltabelle. So weit, so gut. Nun soll das Programm aber selbständig die letzte gefüllte Zeile (z.B. A5) erkennen und dann diesen Text ins Feld A6 schreiben. Bei der nächsten Programmabarbeitung wäre also A6 gefüllt und der betreffende Text müßte in A7 geschrieben werden. Dafür gibt es bestimmt eine ganz einfache Abfrage, oder? Ich sag schon mal danke und Euch allen noch einen schönen Abend! Gruß Ines Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Widmann Mitglied ATHENA Support/Training
 
 Beiträge: 218 Registriert: 24.08.2005
|
erstellt am: 04. Dez. 2006 23:28 <-- editieren / zitieren --> Unities abgeben:          Nur für InesP
Hallo Ines In Excel heißt der Befehl so: msgbox excel.cells.SpecialCells(xlCellTypeLastCell).Address und der gibt dir die Addresse der letzten Zelle aus (z.B. "$A$5") Bin leider schon zu und hab deswegen keinen ACAD-Code damit hingekriegt, musst halt n bisschen experimentieren Viel Glück! ------------------ Mfg Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
   
 Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 04. Dez. 2006 23:50 <-- editieren / zitieren --> Unities abgeben:          Nur für InesP
Hallo auch, specialCells geniesse ich immer bisserl mit Vorsicht;-) Ich ermittele die letzte belegte Zeile in A ZB so:
Code:
Sub x() Dim i& i = Cells(Rows.Count, 1).End(xlUp).Row Debug.Print i End Sub
Je nach Anforderung und Umgebung schaut das sicher anders aus, nur mal auch prinzipiell im nativen Excel, bezogen auf das aktive Sheet, die nächste freie zelle in Spalte A wäre denne cells(i+1,1);-)Grüsse, Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InesP Mitglied

 Beiträge: 66 Registriert: 23.08.2004 Win XP AutoCAD 2004 Office 2000
|
erstellt am: 05. Dez. 2006 08:51 <-- editieren / zitieren --> Unities abgeben:         
Hallo Nancy, Hallo Andreas, vielen Dank für Eure schnelle Hilfe. Ihr schlaft wohl vor dem Computer, zumindest entsteht der Eindruck, wenn ich mir Eure Antwortzeiten anschaue. Ich ziehe jedenfalls den Hut vor Euch. Eure Tipps werde ich etwas später ausprobieren, wenn es hier im Büro etwas ruhiger geworden ist. Ich melde mich wieder. Gruß Ines Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InesP Mitglied

 Beiträge: 66 Registriert: 23.08.2004 Win XP AutoCAD 2004 Office 2000
|
erstellt am: 06. Dez. 2006 11:36 <-- editieren / zitieren --> Unities abgeben:         
Hallo, da bin ich wieder. Gestern war es etwas stressig im Büro, deshalb konnte ich erst heute den Code ausprobieren. Leider bin ich nicht sehr weit gekommen, wahrscheinlich fehlen mir noch elementare VBA-Grundkenntnisse. Andreas, bei Deinem Code bin ich überhaupt nicht dahintergestiegen, was die einzelnen Bausteine (SpecialCells, xlCellTypeLastCell usw.) bedeuten. Ist da irgendwo eine Pfadangabe versteckt, die ich anpassen muss? Nancy, bei Deinem Code brachte mir das Programm Fehlermeldungen bezüglich xlUp, Rows. Bezieht sich Cells auf das aktive Workbook und muß ich das statt Cells angeben. Bitte helft mir, ich seh den Wald vor lauter Bäumen nicht! Gruß Ines Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 06. Dez. 2006 19:58 <-- editieren / zitieren --> Unities abgeben:          Nur für InesP
Hallo Ines, Zitat: Original erstellt von InesP: .... Den in dieses Feld eigetragenen Text sende ich an eine Exceltabelle. ...
Wie machst du das denn mit dem senden ? Kopier doch mal den Code in den Thread. Dann kann man besser sehen wie es bei dir weiter gehen kann. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InesP Mitglied

 Beiträge: 66 Registriert: 23.08.2004 Win XP AutoCAD 2004 Office 2000
|
erstellt am: 06. Dez. 2006 21:19 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli, hier mal paar Codeschnipsel: Dim XL1 As Object ' Variable für Verweis auf Excel-Datei Dim XLProg As Object ' Variable für Verweis auf Excel-Applikation Dim z As Integer Dim s As Integer On Local Error Resume Next z = 1 s = 1 Set XLProg = CreateObject("excel.application") Set XL1 = XLProg.Workbooks.Open("C:\Kommentar.xls") XL1.Worksheets(1).cells(z, s) = UserForm1.Kommentar XLProg.Quit 'Excel-Programm beenden Set XL1 = Nothing 'Verweis auf Tabelle freigeben Set XLProg = Nothing 'Verweis auf Anwendung freigeben So wie es bis jetzt ist, wird der Text immer in Zelle A1 geschrieben. Ist ja auch logisch, da z und s =1 sind. Beim nächsten Programmaufruf (also auch, wenn der Computer zwischendurch aus war) soll das Programm aber automatisch ermitteln, das in Zelle A1 bereits was drinsteht und den nächsten Text also in Zelle A2 ablegen. Deshalb meine Frage nach einer Abfrage der Excelzellen. Leider habe ich weder Nancy's noch Andreas Code verstanden, um ihre Hilfe nachvollziehen zu können. Gruß Ines
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
    
 Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 07. Dez. 2006 11:13 <-- editieren / zitieren --> Unities abgeben:          Nur für InesP
Hallo Ines, bin auch nicht der Excel Spezi. Ich untersuche einfach in einer Schleife ob was in der Zelle steht. Wähle doch mal unter Projekt/Verweise Microsoft Excel aus. Dann kannst du die Methoden und EIgenschaften der Excelobjekte kontexsensitiv eingeben.
Code: Option ExplicitPrivate Sub CommandButton1_Click() Dim ExcelApp As Excel.Application Dim ExcelWorkbook As Excel.Workbook Dim ExcelSheet As Excel.Worksheet Dim Zeile As Long Dim Datei As String Dim DateiOffen As Boolean Datei = "C:\TEMP\TEST.XLS" On Error Resume Next ' Versuch eine laufende ExcelInstanz zu finden Set ExcelApp = GetObject(, "Excel.application") If Err.Number > 0 Then ' Excel neu Starten Set ExcelApp = CreateObject("Excel.application") ExcelApp.visible=true End If On Error GoTo 0 For Each ExcelWorkbook In ExcelApp.Workbooks If UCase(ExcelWorkbook.FullName) = Datei Then DateiOffen = True Exit For End If Next ExcelWorkbook If DateiOffen = False Then ' Wenn noch nicht geladen dann Datei öffnen ' Datei muss vorhanden sein ! ' Ansonsten brauchst du eine Fehlerbehandlung Excel.Application.Workbooks.Open Datei Set ExcelWorkbook = Excel.Application.ActiveWorkbook End If '1. Worksheet aktivieren Set ExcelSheet = ExcelWorkbook.Sheets(1) ' Letzten Eintrag in Spalte A finden Do Zeile = Zeile + 1 Loop While ExcelSheet.Cells(Zeile, 1) <> "" ExcelSheet.Cells(Zeile, 1) = Me.TextBox1.Text End Sub
Versuchs mal so.Stelli ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
   
 Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 07. Dez. 2006 12:31 <-- editieren / zitieren --> Unities abgeben:          Nur für InesP
Hallo Ines, Zitat: Original erstellt von InesP:
Nancy, bei Deinem Code brachte mir das Programm Fehlermeldungen bezüglich xlUp, Rows. Bezieht sich Cells auf das aktive Workbook und muß ich das statt Cells angeben.
ups, du verwendest late Binding, deswegen kennt dein VBA die excelinterne Konstante xlup nicht: Const xlUp = -4162 (&HFFFFEFBE) Element von Excel.XlDirection dies sagt der Objektkatalog in Excel, du müsstest also xlup erstmal explicit definieren, sonst kann Acad/VBA damit überhaupt nix anfangen. Oder aber du verwendest, wie Stelli schon vorschlug, die 'frühe' Bindung, indem du Dir einen Verweis auf M$ Excel x.x Bibo setzt. Damit kennt dann auch Acad/VBA das excelige xlup und noch ein paar andere Nettigkeiten;-) Die letzte belegte Zeile in A müsste sich dann so in etwa widergeben lassen, ich nehm' mal Stellis Code als Basis dann hiesse es dort statt Do Loop so:
Code:
' Letzten Eintrag in Spalte A finden Zeile = excelsheet.Cells(Rows.Count, 1).End(xlUp).Row ExcelSheet.Cells(Zeile, 1) = Me.TextBox1.Text
Oder aber mit late Binding in etwa so:
Code:
Sub stelliCodeLateBinding() Dim ExcelApp As Object Dim ExcelWorkbook As Object Dim ExcelSheet As Object Const xlup = -4162 Dim Zeile As Long Dim Datei As String Dim DateiOffen As Boolean Datei = "d:\Mappe1.XLS" On Error Resume Next ' Versuch eine laufende ExcelInstanz zu finden Set ExcelApp = GetObject(, "Excel.application") If Err.Number > 0 Then ' Excel neu Starten Set ExcelApp = CreateObject("Excel.application") ExcelApp.Visible = True End If On Error GoTo 0 For Each ExcelWorkbook In ExcelApp.Workbooks If UCase(ExcelWorkbook.FullName) = Datei Then DateiOffen = True Exit For End If Next ExcelWorkbook If DateiOffen = False Then ' Wenn noch nicht geladen dann Datei öffnen ' Datei muss vorhanden sein ! ' Ansonsten brauchst du eine Fehlerbehandlung ExcelApp.Application.Workbooks.Open Datei Set ExcelWorkbook = ExcelApp.Application.ActiveWorkbook End If '1. Worksheet aktivieren Set ExcelSheet = ExcelWorkbook.Sheets(1) ' Letzten Eintrag in Spalte A finden Zeile = ExcelSheet.Cells(ExcelSheet.Rows.Count, 1).End(xlup).Row ExcelSheet.Cells(Zeile, 1) = "Bummelletzte" End Sub
Grüße, Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InesP Mitglied

 Beiträge: 66 Registriert: 23.08.2004 Win XP AutoCAD 2004 Office 2000
|
erstellt am: 07. Dez. 2006 14:02 <-- editieren / zitieren --> Unities abgeben:         
Hallo Stelli und Nancy, Ihr seid große Klasse. Es klappt und ich habe wieder viel gelernt. Was ist eigentlich besser, die frühe oder die späte Bindung, wenn ich auf Excel zugreifen will. Achso, die Unities sind an Euch unterwegs! Gruß Ines Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
   
 Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 07. Dez. 2006 15:23 <-- editieren / zitieren --> Unities abgeben:          Nur für InesP
Ist irgendwie eine Glaubensfrage, allerdings kann ich da so schwer Stellung beziehen, was besser ist. Ich denke das hängt davon ab, was du programmierst, für wen und wo der Code überall laufen soll. Vorteil early Binding ist ganz klar, dass sämtliche Objekte und Konstanten des Proggis durch den Verweis bekannt sind. Also um so Konstanten wie xlup, xlcelltypelastcell ... oder zB für Acad Konstanten wie acred, acDimAligned, acFontBold ... musst Du dir keinen Kopf machen, ebensowenig wie um Methoden, etc. da dies alles die Umgebung 'weiß';-) Ein Nachteil (wenn überhaupt so zu nennen) wäre, wenn jemand ein Programm gar nicht hat, geht das in die Hosen, ebenso wie es ggf. Versionskonflikte geben könnte. In Acad2000 hab ich verloren, wenn ich versuche Code mit einem Verweis auf die M$ Regular Expression zum Laufen zu bringen, nehme ich aber statt:
Code:
dim r as New RegExp 'sowas dim r as object set r = createobject("vbscript.regexp")
ist die Welt in Ordnung.Aber das nur mal als ein exotisches Beispiel, wo ich persönlich Negativerfahrung gemacht hab und mit so alten Schinken arbeitet eh kaum einer mehr. Ich denke mal es spricht nix dagegen, innerhalb der Umgebung Acad/Office Verweise zu verwenden, die machen einem das Leben schon angenehmer. Grüsse, Nancy Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
InesP Mitglied

 Beiträge: 66 Registriert: 23.08.2004 Win XP AutoCAD 2004 Office 2000
|
erstellt am: 07. Dez. 2006 18:41 <-- editieren / zitieren --> Unities abgeben:         
Hallo Nancy, dank Dir für Deine Hinweise. Es ist immer wieder das Hintergrundwissen was fehlt und wenn das Proggi nicht läuft steht man da wie doof. Viele Grüße und einen schönen Abend noch! Gruß Ines Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |