2017-03-05 1 views
1

Ich habe eine Arbeitsmappe, die Arbeitsblätter mit dem Text "Vorteile" im Blattnamen enthält. Beispielsweise; MEDICALBenefits oder DENTALBenefits. Es wird immer mindestens eins geben, aber es könnte mehrere geben.Neues Arbeitsblatt erstellen

Ich versuche, ein Makro zu schreiben, die das Arbeitsblatt (n) mit dem Text „Leistungen“ in der Blattnamen und mindestens eine Instanz des Wortes TRUE in Reihe finden 40.

Wenn diese beiden Kriterien werden erfüllt, dann muss ich ein neues Arbeitsblatt erstellen, das den gleichen Arbeitsblattnamen verwendet, aber den Text "Vorteile" durch den Text "Final" ersetzt, mit anderen Worten; Wenn das Arbeitsblatt MEDICALbenefits TRUE in einer oder mehreren Zellen in Zeile 40 hat, wird ein neues Blatt MEDICALFinal erstellt.

Wenn das Arbeitsblatt DENTALBenefits TRUE in einer oder mehreren Zellen in Zeile 40 hat, wird ein neues Blatt mit dem Namen DENTALFinal erstellt.

Ich brauche es dann durchlaufen alle Blätter auf der Suche nach "Vorteile" im Namen und TRUE in Zeile 40 und erstellen Sie ein neues Blatt.

Dies ist der Code, den ich bisher habe, aber Hilfe bei der Benennung der neuen Blätter.

Jordan

'Look for worksheet names *benefits* with checkbox(s) = true 
Sub CreateFinalWorksheet() 
    Dim sh As Worksheet 
    Dim iVal As Integer 
    Application.ScreenUpdating = False 
    For Each sh In ActiveWorkbook.Sheets 
     iVal = Application.WorksheetFunction.CountIf(Range("40:40"), "TRUE") 
     If (LCase$(sh.Name) Like "*benefits*") And (iVal > 0) Then Call AddWorksheet 
    Next sh 
    Application.ScreenUpdating = True 
End Sub 


'Called from CreateFinalWorksheet. 
'Add worksheet with same sheet name replacing *benefits* with *final* 
Sub AddWorksheet() 
    Dim sh As Worksheet 
    With ThisWorkbook 
     Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count)) 
     ws.Name = "MedicalFinal" 
    End With 
End Sub 

Antwort

1

bearbeitet nach OPs Klärung er will, dass alle "* Vorteile" Blätter finden

in

iVal = Application.WorksheetFunction.CountIf(Range("40:40"), "TRUE") 

sind Sie aktuelle sh Arbeitsblatt Bezug fehlt, so können Sie wie folgt schreiben wollen:

iVal = Application.WorksheetFunction.CountIf(sh.Range("40:40"), "TRUE") 

Für was oben und für Ihr Hauptproblem, würde ich wie folgt gehen:

+0

Ich habe beide Vorschläge ausprobiert und beide erstellt ein neues Blatt MEDICALFinal, aber nicht zum nächsten Blatt DENTALBenefits, um das nächste neue Blatt zu erstellen DENTALFinal. Ich dachte nach dem Aufruf des Subs würde es zum ersten Makro zurückkehren und den Rest der Blätter durchlaufen. Ich bin sehr neu in VBA und bin mir nicht sicher, wie ich die erforderlichen Änderungen vornehmen kann. – JordanCA57

+0

@ JordanCA57, siehe bearbeitete Antwort. Wenn es Ihre Frage löst, markieren Sie es bitte als akzeptiert, indem Sie auf das Häkchen neben der Antwort klicken, um es von ausgegraut auf ausgefüllt umzuschalten. Vielen Dank – user3598756

+0

Ich musste nur die gleichen zu großen als ändern. Das verstehe ich. Den Rest werde ich gehen und es herausfinden. Dies ist sehr hilfreich beim Lernen. – JordanCA57

0

einen Parameter Ihre AddWorksheet Routine hinzufügen, lassen Sie es die "Vorteile" Arbeitsblatt Schließlich

If (LCase$(sh.Name) Like "*benefits*") And (iVal > 0) Then AddWorksheet sh 

Sub AddWorksheet(benef as worksheet) 
    .... 
    ws.name = Replace(benef.name, "benefits", "Final", , vbTextCompare) 

sein, können Sie auch andere Dinge tun, in diesem Unter wie das Kopieren einige Daten aus dem Parameter-Arbeitsblatt benef.

+0

Es erstellt ein neues Blatt MEDICALFinal, aber nicht zum nächsten Blatt DENTALBenefits, um das nächste neue Blatt DENTALFinal zu erstellen. Ich dachte nach dem Aufruf des Subs würde es zum ersten Makro zurückkehren und den Rest der Blätter durchlaufen. – JordanCA57

+0

@ JordanCA57 es tut, was ich zeigte, ist nur ein Weg, um Ihre Routine zu ändern und es zu nennen. Denken Sie auch daran, einige andere Probleme in Ihrem Code zu beheben, die nichts mit der Frage zu tun haben, z. B. Ihre Bereiche. –

Verwandte Themen