Hilfe bei Codeerweiterung

  • Excel

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von marci1896.

    Hilfe bei Codeerweiterung

    Hallo,

    ich bin hier neu angemeledet und hoffe man kann mir ein wenig helfen.

    ich bin kein VBA Spezialist. Ich stecke da noch in den Kinderschuhen. ABer hatte jetzt die AUfageb in einer exceltabelle einen makro einzubauen um die größe der datei zu schrumpfen.

    mein makro soll folgendes können:

    ich habe eine tabelle:
    spalte A: Netzplan
    spalte B. Dauer
    Spalte F Anfang
    Spalte G: Ende
    Spalte H. Laufzeit

    I1-T1: 1.Geschäftsjahr

    V-AG: 2.Geschäftsjahr

    AI-AT: 3.Geschäftsjahr

    AV-BG: 4.Geschäftsjahr

    er soll dann I1 nehmen (zb.15.10.06) und gucken ob es zwischen Anfang und Ende liegt. Anfang und Ende jeweils ein Datum.

    wenn das der fall ist soll er B6 durch H6 teilen und das ergebnis in I6 reinschreiben. dann soll er natürlich weitergucken.I1 nehmen und gucken ob es zwischen F7 und G7 liegt und immerso weiter...zwischen F8 und G8. ergebnis immer in das entprechende feld schreiben. also wenn er guckt ob es zwischen F13 und G13 liegt in I13 ergebnis reinschreiben.

    wenn er mit der spalte fertig ist soll er J1 nehmen und das gleiche spiel nochmal machen.



    was mein makro bis jetzt kann:

    Visual Basic-Quellcode

    1. Sub Test()
    2. If Range("I1") > Date - 1000 And _
    3. Range("I1").Value < Date + 1000 Then
    4. Range("I6").Value = Range("B6").Value / Range("H6").Value
    5. End If
    6. End Sub




    wie man sehen kann, kann er bis jetzt "nur" das er sich I1 nimmt und guckt ob es sich heute plusminus 1000 tage befindet( is ja nicht sinn der sache :( ) aber anders konnte ich es nicht lösen.

    wenn das hier der fall is teilt er zb. B6 durch H6 und schreibt das ergebnis in I6. nur weiß ich nicht wie ich es machen soll das er eine zelle weiterguckt.



    ich hoffe ich konnte mein problem einigermaßen beschreiben....



    vielen dank für jeden rat....





    ps. ich werde mein problem auch in anderen foren posten, da es mir wichtig is das mein problem gelöst wird. wenn ich dort antworten bekommen poste ich sie hier natürlich!!
    Das kann man eigentlich auch mit einer Formel, also ohne VBA, lösen.

    Wenn ich dich richtig verstanden habe, müsste folgende Formel in I6 das gewünschte Ergebnis bringen:

    Quellcode

    1. =WENN(UND(I$1>$F6;I$1<$G6);$B6/$H6;"")


    Diese Formel brauchst du dann nur nach rechts und unten ausfüllen.

    Ich hab mal als Sonst-Argument einen Leerstring ("") eingetragen. Stattdessen kannst du natürlich eintragen, was du willst.


    Wenn du es doch mit einem Makro machen willst:

    Schau dir in der VB-Hilfe mal den Eintrag "Cells-Eigenschaft" an. Dort siehst du, wie du einen definierten Tabellenbereich per Schleife durchgehen kannst. Den verwendeten Bereich einer Tabelle kannst du mit Hilfe der UsedRange-Eigenschaft abfragen.


    Ich hoffe, ich habe dir damit weitergeholfen.
    hallo,

    mit einer Formel habe ich das Problem schon gelöst. aber wenn ich es mit der formel lasse steigt die größe der datei ins unendliche...das is das große problem. deshalb brauche ich diesen makro. und so wie ich ihn bis jetzt habe erfüllt er ja noch nicht alle gewünschten funktionen. die vb-hilfe werde ich mir gleich mal anschaun. hoffe ich kriege es hin...is echt wichtig...:-(

    aber danke schonmal!!
    Ich habe eben mal ein bißchen gegoogelt und folgendes gefunden.

    Es muss ja geprüft werden ob das eine datum zwischen anfang und ende liegt.

    dazu habe ich folgenden code gefunden:

    Visual Basic-Quellcode

    1. 'Beispiel: VB .Net - Pruefen ob ein Datum zwischen zwei Daten liegt
    2. '
    3. Option Explicit On
    4. Option Strict On
    5. Public Class Form1
    6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    7. Handles Button1.Click
    8. 'Dim dtComparisonsAlso As Date = Now()
    9. Dim dtComparisonsAlso As Date = #3/3/2007 12:00:00 PM#
    10. 'Monat / Tag / Jahr
    11. Dim dtMin As Date = #3/1/2007 12:00:00 PM#
    12. Dim dtMax As Date = #3/2/2007 12:00:00 PM#
    13. Dim Result As Boolean = Me.CompareDate(dtComparisonsAlso, dtMin, dtMax)
    14. Select Case Result
    15. Case True
    16. MessageBox.Show(Result.ToString() & System.Environment.NewLine & _
    17. "Das Vergleichsdatum befindet sich zwischen den Vergleichsdaten", "Info")
    18. Case Else
    19. Dim msg As String = "Das angegebene Vergleichsdatum befindet sich nicht zwischen den zu vergleichenden Bereichen"
    20. MessageBox.Show(Result.ToString() & System.Environment.NewLine & _
    21. msg, "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
    22. End Select
    23. End Sub
    24. ''' <summary>
    25. ''' Es wird verglichen ob dtComparisonsAlso zwischen dtMin und dtMax liegt
    26. ''' </summary>
    27. ''' <param name="dtComparisonsAlso"></param>
    28. ''' <param name="dtMin"></param>
    29. ''' <param name="dtMax"></param>
    30. Private Function CompareDate(ByVal dtComparisonsAlso As Date, ByVal dtMin As Date, ByVal dtMax As Date) As Boolean
    31. Try
    32. If dtComparisonsAlso >= dtMin AndAlso dtComparisonsAlso <= dtMax Then
    33. Return True
    34. Else
    35. Return False
    36. End If
    37. Catch ex As Exception
    38. MessageBox.Show(ex.Message.ToString(), "Info")
    39. End Try
    40. End Function
    41. End Class




    nur sagt mir der code nix :D wüsste jetzt nicht wie ich den mit meinem code verknüpfen könnte....
    Der Code, den du da gefunden hast, ist VB.NET-Code. Da ist der Umgang mit Datumsangaben etwas anders als bei VBA.

    Mit folgendem Code werden alle Zellen ab einer bestimmten Startzelle durchlaufen, wobei deine Formel angewandt wird:

    Visual Basic-Quellcode

    1. Dim z As Integer, s As Integer
    2. 'z steht für Zeile, s für Spalte
    3. 'Folgende Schleife startet in Zeile 13 und Spalte 10 (= Spalte J)
    4. For z = 13 To ActiveSheet.UsedRange.Rows.Count '= Anzahl benutzter Zeilen
    5. For s = 10 To ActiveSheet.UsedRange.Columns.Count '= Anzahl benutzter Spalten
    6. If Cells(1, s) >= Cells(z, 6) And Cells(1, s) <= Cells(z, 7) Then
    7. Cells(z, s) = Cells(z, 2) / Cells(z, 8)
    8. Else
    9. Cells(z, s) = 0
    10. End If
    11. Next
    12. Next


    Wenn die Tabelle groß ist, kann das jedoch unter Umständen ein wenig dauern.

    Gibt es einen bestimmten Grund, dass du $A13=$A13 in deiner Formel hast? Das ist doch eigentlich immer WAHR, wodurch es im Grunde unnötig ist.


    Alternativ kannst du deine Formel per VBA mit einem Einzeiler :!: eintragen lassen:

    Visual Basic-Quellcode

    1. Range(Cells(13, 10), Cells(ActiveSheet.UsedRange.Rows.Count, _
    2. ActiveSheet.UsedRange.Columns.Count)).FormulaR1C1 = "=IF(AND(R1C>=RC6,R1C<=RC7,RC1=RC1),RC2/RC8,0)"


    Hier wird im Bereich von J13 bis zum Ende der Tabelle die Formel eingetragen.
    Hallo roddy...

    variante 1 ist genau das was ich wollte!! aber du hast recht das es ziemlich lange dauert bis er fertig ist. das kann ich nicht irgendwie beeinflussen oder?? also...entweder ich nehm den makro, der meine datei verkleinert, aber lange dauert. oder ich nehm die variante mit der formel in die zellen...das dauert nur sekunden...lässt meine datei aber wachsen und wachsen. und gerade das wollte ich verhindern.
    die datei die ich jetzt hier habe, hat mit formeln ca. 16mb...mit makro nur 10mb..was ok is. nur bin ich mal gespannt was mein chef zu dem zeitfaktor sagt :)


    DANKE AN RODDY NATÜRLICH!!
    guten morgen!

    das zeitproblem habe ich gelöst. habe einfach die automatische berechnung ausgeschaltet :)

    aber habe eben gesehen das ich noch ein kleines problem habe. er nimmt ja immer das datum aus zb. J1 K1 L1 usw...gibt es die möglichkeit das er zwischendurch mal einen auslassen soll??? denn nach jedem geschäftsjahr wird die summe gebildet..in einer spalte. und da berechnet er jetzt natürlich auch und ersetzt so die summenformel. das natürlich nur so mittelgut :D gibts da viell ne möglichkeit U1 AH1 AU1 und BH1 auszulassen???
    Da bietet sich "Select Case" an:

    Visual Basic-Quellcode

    1. Dim z As Integer, s As Integer
    2. 'z steht für Zeile, s für Spalte
    3. 'Folgende Schleife startet in Zeile 13 und Spalte 10 (= Spalte J)
    4. For z = 13 To ActiveSheet.UsedRange.Rows.Count '= Anzahl benutzter Zeilen
    5. For s = 10 To ActiveSheet.UsedRange.Columns.Count '= Anzahl benutzter Spalten
    6. Select Case Cells(1, s).Address
    7. Case "$U$1", "$AH$1", "$AU$1", "$BH$1"
    8. Case Else
    9. If Cells(1, s) >= Cells(z, 6) And Cells(1, s) <= Cells(z, 7) Then
    10. Cells(z, s) = Cells(z, 2) / Cells(z, 8)
    11. Else
    12. Cells(z, s) = 0
    13. End If
    14. End Select
    15. Next
    16. Next


    Nach dem ersten "Case" kommt kein Befehl, somit wird in diesen Fällen nichts gemacht. Die If-Abfrage nach dem "Case Else" greift dann für alle anderen Fälle.
    Morgen,



    klappt super...da hätte ich aber auch selber drauf kommen können. soviel hätte aus dem grundkurs programmieren im 1.semester noch hängenbleiben müssen :) ich seh schon ich muss mich mal intensicver damit beschäftigen.

    hat mir jetzt fast 6mb gespart...

    danke dir roddy...
    Guten morgen!



    ich habe meine formel erweitert und nun wollt ich diese auch wieder in code umwandeln. leider hat sich irgendwie ein fehler eingeschlichen. er berechnet mir schon das richtige ergebnis, nur schreibt er mir es in die falsche zelle...und ich weiß nicht woran es liegt.

    das ist miene excel formel: =WENN(UND(R$1>=$O3;R$1<=$P3;$Q3>0;$P3>=$BV$1);$B3/$Q3;0)



    und das mein code:

    Visual Basic-Quellcode

    1. Sub Code()
    2. Dim z As Integer, s As Integer
    3. 'z steht für Zeile, s für Spalte
    4. 'Folgende Schleife startet in Zeile 3 und Spalte 19 (= Spalte S)
    5. For z = 3 To ActiveSheet.UsedRange.Rows.Count
    6. For s = 19 To ActiveSheet.UsedRange.Columns.Count
    7. Select Case Cells(1, s).Address
    8. Case "$AE$1", "$AR$1", "$BE$1", "$BR$1", "$BS$1", "$BT$1", "$BU$1", "$BV$1"
    9. Case Else
    10. If Cells(1, s) >= Cells(z, 15) And Cells(1, s) <= Cells(z, 16) And Cells(z, 17) > 0 And Cells(z, 16) >= Cells(1, 74) Then
    11. Cells(z, s) = Cells(z, 2) / Cells(z, 17)
    12. Else
    13. Cells(z, s) = 0
    14. End If
    15. End Select
    16. Next
    17. Next
    18. End Sub




    also das was er zb. in zelle AQ1541 schreibt soll da nicht stehen...sondern in AS1541...





    noch was vergessen...er soll in zeile 3 und spalte 19 anfangen werte reinzuschreiben. ABER dieses mal soll er wenn er in 3,19 was reinschreibt nicht aus spalte 19 den wert zum vergleichen nehmen sondern aus der spalte davor..also in dem fall spalte 18. und das macht er irgendwie nicht...mit der formel macht er es....hab ich die formel bestimmt falsch umgesetzt...:-(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „marci1896“ ()

    guten morgen!



    ja genau das war es...war mal wieder viel zu einfach ;)



    habe jetzt noch ein bißchen weiter daran rumgebastelt.

    ich habe ja in meiner tabelle 4 tabellenblätter wo die makros ausgeführt werden. und am anfang habe ich noch ein anderes tabellenblatt als übersicht, in der er die ergenisse nochmal zusammenfasst. da wollte ich jetzt auch einen makro haben, der die 4 einzelnen makro einzeln ausführt und noch einen makro der alle gleichzeitog ausführt. da dachte cih mir..reicht ja wenn ich das ding aufzeichne und immer in das tabellenblatt reinspringe und jeden makro einzeln ausführe. klappt auch...ABER..jetzt kann ich den namen der datei nicht ändern..also wenn ich das mache..also speichern unter..blabla..funktioniert es nicht mehr, da es jetzt auf den dateinamen zugeschnitten ist...



    hier mal mein code:

    Visual Basic-Quellcode

    1. Sub Makro 1()
    2. Application.Run _
    3. "'Muster.xls'!automatische_Berechnung_off"
    4. Sheets("PLAN-Kostenaufteilung").Select
    5. Application.Run _
    6. "'Muster.xls'!Plankosten"
    7. Sheets("Mitkalk ").Select
    8. Application.Run _
    9. "'Muster.xls'!automatische_Berechnung_on"
    10. End Sub
    11. Sub Makro 2()
    12. Application.Run _
    13. "'Muster.xls'!automatische_Berechnung_off"
    14. Sheets("IST-Kostenaufteilung").Select
    15. Application.Run _
    16. "'Muster.xls'!IST_Kostenaufteilung"
    17. Sheets("Mitkalk ").Select
    18. Application.Run _
    19. "'Muster.xls'!automatische_Berechnung_on"
    20. End Sub
    21. Sub Makro 3()
    22. Application.Run _
    23. "'Muster.xls'!automatische_Berechnung_off"
    24. Sheets("Aktuell-Kostenaufteilung").Select
    25. Application.Run _
    26. "'Muster.xls'!Aktuellkosten_Aufteilung"
    27. ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
    28. Sheets("Mitkalk ").Select
    29. Application.Run _
    30. "'Muster.xls'!automatische_Berechnung_on"
    31. End Sub
    32. Sub Makro 4()
    33. Application.Run _
    34. "'Muster.xls'!automatische_Berechnung_off"
    35. Sheets("Restaufwand-Kostenaufteilung ").Select
    36. Application.Run _
    37. "'Muster.xls'!Restaufwand_Kostenaufteilung"
    38. ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
    39. Sheets("Mitkalk ").Select
    40. Application.Run _
    41. "'Muster.xls'!automatische_Berechnung_on"
    42. End Sub




    die habe ich aufgezeichnet um in dem übersichtstabellenblatt jeden makro einzeln auszuführen.



    hier mein makro der alle ausführen soll....

    Visual Basic-Quellcode

    1. Sub Main()
    2. Application.Run _
    3. "'Muster.xls'!Plankosten_einzel"
    4. Application.Run _
    5. "'Muster.xls'!Istkosten_einzel"
    6. Application.Run _
    7. "'Muster.xls'!Aktuell_einzel"
    8. Application.Run _
    9. "'Muster.xls'!Rest_einzel"
    10. End Sub




    wie gesagt..es klappt zwar, aber kann ich nicht mehr die datei unter einem anderen namen speichern...ohne den makro anzupassen...und das is natürlich so mittelgut :)