Seite 1 von 1
makros, zellen, vba ... HILFE
Verfasst: Mi, 17.05.2006 08:48
von derhuk
hi
ich muss eine excel tabelle in calc umarbeiten da wir auf oO umstellen.
hier der vba code
-------------------------------------------------------------------------------------
Code: Alles auswählen
Sub MarkierteZeileKopieren()
Dim Cr As Long, CC As Integer
Dim Projektnummer As Object
Dim appWD As New Word.Application
CC = 1
'Übernehmen der Zeile
Cr = Selection.Row
'Senden an Zieladressen
Application.ScreenUpdating = False 'Bildschirmaktualisierung aus
Cells(Cr, CC).Select 'Nr. (Nummer) 'Zelle auswählen
Selection.Font.Bold = True 'Fettschrift ein
Selection.Font.Size = 12 'Schriftgröße 12
Selection.Copy 'Zelle kopieren
Set appWD = CreateObject("word.Application") 'Programm Word öffnen
appWD.Visible = True 'sichtbar
appWD.documents.Add ("pfad des dokuments") 'öffnen des Dokumentes als neues
appWD.Selection.GoTo What:=wdGoToBookmark, Name:="Nummer" 'zur Textmarke springen
appWD.Selection.Paste 'Inhalt Zelle einfügen
Selection.Font.Bold = False 'Fettschrift aus
Selection.Font.Size = 10 'Schriftgröße 10
Cells(Cr, CC + 1).Copy 'Kunde (Kunde)
appWD.Selection.GoTo What:=wdGoToBookmark, Name:="Kunde"
appWD.Selection.Paste
Cells(Cr, CC + 5).Copy 'Projektverantwortlicher (Bearbeiter)
appWD.Selection.GoTo What:=wdGoToBookmark, Name:="Bearbeiter"
appWD.Selection.Paste
Cells(Cr, CC + 6).Copy 'Teilenummer (Teilenummer)
appWD.Selection.GoTo What:=wdGoToBookmark, Name:="Teilenummer"
appWD.Selection.Paste
appWD.Selection.GoTo What:=wdGoToBookmark, Name:="Datum" 'zur Textmarke springen
appWD.Selection.Font.Name = "Arial" 'Schriftart ändern
appWD.Selection = Date 'Aktuelles Datum einfügen
Application.ScreenUpdating = True 'Bildschirmaktualisierung an
End Sub
------------------------------------------------------------------------------------
wie kann ich das in starbasic realisieren ? ich weiss wie man eine zelle ausliest usw. aber ich komme absolut nicht voran mit diesem prog.
danke im vorraus
Verfasst: Mi, 17.05.2006 10:17
von Stephan
ich weiss wie man eine zelle ausliest usw.
Dann poste doch bitte den bisherigen Code den Du schon selbst 'übersetzen' konntest und sage uns an welchen Stellen Du dot konkret nicht weiterkommst.
Gruß
Stephan
Verfasst: Mi, 17.05.2006 10:29
von derhuk
Code: Alles auswählen
Dim oDialog as Object 'globale dev des dialoges
Dim ODoc as Object 'das dokument
dim oZelle as Object 'die zelle
dim oZelle2 as Object
Sub MarkierteZeileKopieren
'DialogLibraries.LoadLibrary("Standard")
oDoc = thisComponent
oZelle = oDoc.getCurrentSelection()
oZelle2 = oDoc.getCurrentSelection(+1)
oDialog = createUnoDialog(DialogLibraries.Standard.Dialog1)
s = "text :" & oZelle.String
ss = oZelle2.String
msgBox s & " zeile daneben " & ss
'oDialog.execute()
End Sub
hatte ich zb mal probiert. ich dache vielleicht auch statt die +1 next oder irgendwas aber geht ja nicht. die msgbox ist nur zum testen
sheet.getCellRangebyName("B2")
gibt es ja zb auch .. nur das prob ist ich habe eine tabelle von A-N und ca 4000 zeilen darin und ich brauche auch alle daten von A-N aus der jehweiligen zeile nacheinander weil diese ja dann in die text dokument vorlage geschrieben werden bzw bei den sprungmarken eingesetzt werden. da habe ich auch keine ahung wie das funktioniert...
ich hatte mir schon überlegt das ich in mehrer zellen a b c .... schreibe und mir dann immer diesen wert hole damit ich dann halt so die einzelnen zellen ansprechen kann. aber das wäre ja dann totaler frumms. vorallem bei der datenmenge...
ich arbeite erst seit einer woche mit oO. habe mir nur ein buch geholt und da mal ein wenig nachgelesen. vorher habe ich mit quattro und paradox gearbeitet...
Verfasst: Mi, 17.05.2006 12:31
von Stephan
hatte ich zb mal probiert. ich dache vielleicht auch statt die +1 next oder irgendwas aber geht ja nicht.
Ja Sorry und warum liest Du nicht nach? Ich habe die wesentlichen Dinge zusammengestellt, mehr als Du für Deine Aufgabe brauchst:
viewtopic.php?t=1553
und das hier ist genau passend:
http://www.bcwin.ch/ooo/basic/calc/calc.html
auch das hier dürfte interessant sein:
http://www.openoffice.org/nonav/issues/ ... icXref.sxw
nur das prob ist ich habe eine tabelle von A-N und ca 4000 zeilen darin
ein weiteres Problem ist offensichtlich das die SHIFT-Taste Deiner Tastatur defekt ist ...
und ich brauche auch alle daten von A-N aus der jehweiligen zeile nacheinander
dann mußt Du durch den gewünschten Bereich interieren, z.B.:
Code: Alles auswählen
Sub Main
myDoc = ThisComponent
mySheet = myDoc.sheets(0)
mycellRange = mysheet.getCellRangeByName("A1:B4")
For i = mycellRange.getRangeAddress().StartRow To mycellRange.getRangeAddress().EndRow
For j = mycellRange.getRangeAddress().StartColumn To mycellRange.getRangeAddress().EndColumn
MsgBox mySheet.getCellByPosition(j,i).String
Next j
Next i
End Sub
weil diese ja dann in die text dokument vorlage geschrieben werden bzw bei den sprungmarken eingesetzt werden. da habe ich auch keine ahung wie das funktioniert...
http://www.dannenhoefer.de/faqstarbasic ... ndTex.html
habe mir nur ein buch geholt und da mal ein wenig nachgelesen
Und Welches? Es gibt nur eine Handvoll Bücher zur OOo-Programmierung, die enthalten aber alle die Infos die Du offensichtlich brauchst.
Gruß
Stephan
Verfasst: Mi, 17.05.2006 13:29
von derhuk
Danke das bringt mich schon mal ein ganzes Stück weiter.
Ich brauche halt zb. den Bereich A4:N4. Das ganze soll dann abhängig davon sein, welche Zeile man gerade angewählt hat. Zb. Zeile 3210. Wie funktioniert das dann das statt dem A4:N4 A3210:N3210 wird? Ich kann ja die aktuelle Zelle auslesen und mir den Zellen Name als string ausgeben lassen nun hätte ich aber zb. C3210 ales Zellen Name. Ich bräuchte ja aber A3120 und N3210. Kann ich da von dem string (C3210) das "C" löschen? Weil dann könnte ich ja einfach "A" & "3120" und "N" & "3210" nehmen für
nehmen.
Wie kann ich ausserdem jeden ausgelesen Wert in einer variable speicher?
Ich habe mir da überlegt das ich in die schleife eine Variable zb. S1 nehme und immer den ausgelsen Wert in S1 schreibe und dann am ende S1 = S&1 nehme da müsste dann ja S1, S11, S111... rauskommen oder?
Vorher müsste ich ja dann noch S1 bzw. S11.. immer wieder "leeren" das müsste ja mit S1 ="" gehen oder? Grund dafür ist ich habe noch eine 2. Tabelle wo ich nicht alle Werte brauche. Ich weiss auch keinen anderen Weg wie ich diese sonst rausfiltern könnte.
Der link mit den Textmarken funktioniert leider nicht.
Danke für die schnelle Hilfe und die guten Tips!
ps.: Die "shift-Taste" funktioniert

Verfasst: Mi, 17.05.2006 14:12
von Stephan
Wie funktioniert das dann das statt dem A4:N4 A3210:N3210 wird?
Ist es Dir möglich ein ganz klein wenig auch selbst zu tun? Ich hatte Dir das ganz genau passende Dokument genannt:
http://www.bcwin.ch/ooo/basic/calc/calc.html
(dort Kapitel 7.1)
Hast Du dort auch nur 5 Minuten reingesehen?
Ich verstehe die Aufgabe eines Forums nicht darin auch Nachfrage eine fertige Lösung zu liefern, sondern Hilfe zur Selbsthilfe zu geben.
Somit beispielsweise:
Code: Alles auswählen
Sub Main
Dim S(0) as String
myDoc = ThisComponent
mySheet = myDoc.sheets(0)
mycellRange = ThisComponent.getCurrentSelection()
For i = mycellRange.getRangeAddress().StartRow To mycellRange.getRangeAddress().EndRow
For j = mycellRange.getRangeAddress().StartColumn To mycellRange.getRangeAddress().EndColumn
MsgBox mySheet.getCellByPosition(j,i).String
w = UBOUND(S())
s(w) = mySheet.getCellByPosition(j,i).String
Redim Preserve S(w+1) As String
Next j
Next i
For I = LBOUND(S()) To UBOUND(S())-1
erg = erg & S(I) & CHR(13)
Next
Msgbox erg
End Sub
Ich habe mir da überlegt das ich in die schleife eine Variable zb. S1 nehme und immer den ausgelsen Wert in S1 schreibe
ist schon im obenstehenden Code:
Code: Alles auswählen
'...
Dim S(0) as String
'...
w = UBOUND(S())
s(w) = mySheet.getCellByPosition(j,i).String
Redim Preserve S(w+1) As String
'...
und auch die Kontrollausgabe:
Code: Alles auswählen
'...
For I = LBOUND(S()) To UBOUND(S())-1
erg = erg & S(I) & CHR(13)
Next
Msgbox erg
'...
Der link mit den Textmarken funktioniert leider nicht.
Ja, ich weiß weil die Forumssoftware die Klammer im Link nicht automatisch akzeptiert hat. Sorry, aber es ist mir unverständlich das Du selbst zu bequem bist Dir die Zielseite selbst zu suchen indem Du den Link komplett manuell in die Adresszeile des Browsers kopierst. Das schiene mir ein Mindestmaß an Beteiligung, statt nur darauf zu warten das Dir alles auf einem Tablett serviert wird.
Gruß
Stephan
Verfasst: Mi, 17.05.2006 14:39
von derhuk
Ich hatte das mit dem link probiert ich wusste das mit der Klammer nur nicht. Sorry. Mir war auch gerade eingefallen das ich für S ja ein Feld nehmen kann aber irgendwie funktionierte das nicht
Code: Alles auswählen
Sub Main
dim a(20) 'habe hier auch a() probiert
myDoc = ThisComponent
mySheet = myDoc.sheets(0)
mycellRange = mysheet.getCellRangeByName("A3:N3")
For i = mycellRange.getRangeAddress().StartRow To mycellRange.getRangeAddress().EndRow
For j = mycellRange.getRangeAddress().StartColumn To mycellRange.getRangeAddress().EndColumn
MsgBox mySheet.getCellByPosition(j,i).String
for h = 0 to 19
a(h) =mySheet.getCellByPosition(j,i).string
next h
Next j
Next i
msgbox("test" + a(1) + a(3))
End Sub
So hatte ich mir das da eigentlich gedacht aber als Ergebnis kommt dann 2 mal der Text der in N3 steht.
Ich weiss das es nicht die Aufgabe des Forums ist mir eine fertige Lösung zu geben. Ich habe auch im Internet geforscht sowie im Buch nur wenn man etwas noch nie gemacht hat und nur einen Tag Zeit hat ist es nicht so einfach ich müsst mich normal erstmal eine Woche oder so in die Sprache einarbeiten. Da wäre es dann was anderes. Aber Chef macht Druck und ich bin in der probezeit.
Verfasst: Mi, 17.05.2006 15:22
von derhuk
Ich habe hier nochmal dem code Kommentiert so wie ich es verstanden habe.
Code: Alles auswählen
Sub Main
Dim S(0) as String
myDoc = ThisComponent
mySheet = myDoc.sheets(0)
mycellRange = ThisComponent.getCurrentSelection() 'lieber angewählte zelle oder zellenbereich (range, ranges)
For i = mycellRange.getRangeAddress().StartRow To mycellRange.getRangeAddress().EndRow 'von anfang bis ende
For j = mycellRange.getRangeAddress().StartColumn To mycellRange.getRangeAddress().EndColumn 'von a bis e
MsgBox mySheet.getCellByPosition(j,i).String 'zelleninhalt in msgbox ausgeben
w = UBOUND(S()) 'größte indexzahl
s(w) = mySheet.getCellByPosition(j,i).String 'in höchsten index zelleninhalt schreiben
Redim Preserve S(w+1) As String 'array vergrößern , elemente bleiben erhalten
Next j
Next i
For I = LBOUND(S()) To UBOUND(S())-1 'liefert kleinste und größte indexzahl
erg = erg & S(I) & CHR(13) 'wenn s(*) dann nur das bestimmte element
Next
Msgbox erg 'wenn s(*) *= indexzahl dann nur gewünschtes
End Sub
habe aber noch eine Frage zu
hier wird es ja vergößert
und hier wird es ja wieder verkleinert bzw wird das lezte element nicht angesprochen also wozu das ?
Oder habe ich da jetzt einen Denkfehler drin
Verfasst: Mi, 17.05.2006 15:59
von Stephan
und hier wird es ja wieder verkleinert bzw wird das lezte element nicht angesprochen also wozu das ?
weil ich zu bequem war es anders zu schreiben. Da ich weiß das nach jedem Neueintrag das Array um ein Feld vergrößert wird:
Code: Alles auswählen
w = UBOUND(S())
s(w) = mySheet.getCellByPosition(j,i).String
Redim Preserve S(w+1) As String
weiß ich das nach dem letzten Neueintrag das Array um ein Feld 'zu groß' ist, also das letzte Feld keinen Wert mehr enthält und ich es nicht auslesen muß. Deshalb lese ich nur bis zum vorletzten Feld aus.
Gruß
Stephan
Verfasst: Do, 18.05.2006 14:27
von derhuk
so hab jez hin und her gebastel und auch schon gute Erfolge gehabt aber irgendwie will es noch nicht so richtig..
Dokument öffnen funkt so oder ?
Code: Alles auswählen
url=converttourl("C:\test.doc")
dim myFileProp as Object
oDocument = StarDesktop.loadComponentFromURL(url, "_blank", 0, myFileProp() )
und zu Anker springen so ..
Code: Alles auswählen
oBookmarks = oDokument.Bookmarks
oBookmark=oBookmarks.getByName( "Textmarke" )
oAnchor= oBookmark.getAnchor
oAnchor.setString("Mein Text")
Müsste ja dann eigentlich passen oder mache ich da etwas falsch?