makros, zellen, vba ... HILFE

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

derhuk
Beiträge: 7
Registriert: Mi, 17.05.2006 08:36

makros, zellen, vba ... HILFE

Beitrag 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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag 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
derhuk
Beiträge: 7
Registriert: Mi, 17.05.2006 08:36

Beitrag 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...
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag 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
derhuk
Beiträge: 7
Registriert: Mi, 17.05.2006 08:36

Beitrag 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

Code: Alles auswählen

 mycellRange = mysheet.getCellRangeByName("A3:N3")  
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 :P
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag 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
derhuk
Beiträge: 7
Registriert: Mi, 17.05.2006 08:36

Beitrag 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.
derhuk
Beiträge: 7
Registriert: Mi, 17.05.2006 08:36

Beitrag 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

Code: Alles auswählen

Redim Preserve S(w+1) As String 
hier wird es ja vergößert

Code: Alles auswählen

For I = LBOUND(S()) To UBOUND(S())-1
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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag 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
derhuk
Beiträge: 7
Registriert: Mi, 17.05.2006 08:36

Beitrag 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?
Antworten