2016-07-20 12 views
1

Ich arbeite an einem Excel-Makro (Schaltfläche), die eine Spalte an der gleichen Stelle in mehreren Arbeitsblättern hinzufügen wird. Außerdem muss diese Spalte über eine Spaltenüberschrift verfügen, die über ein Dialogfeld eingegeben wird.Excel VBA - Hinzufügen neuer Spalten mit Text und Formatierung zu mehreren Arbeitsblättern

Jedes Arbeitsblatt enthält eine genau formatierte Tabelle - der einzige Unterschied sind die Arbeitsblattnamen. Hier

ist das, was ich bisher:

Sub CommandButton2_Click() 

Sheets(Array("Sheet1", "Sheet2")).Select 
Sheets("Sheet2").Activate 
Columns("F:F").Select 
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromRightOrBelow 

Dim myValue As Variant 

myValue = InputBox("Enter Thought Leadership Title", "New Thought Leadership", "XXXXX") 

Sheets(Array("Sheet1", "Sheet2”)).Select 
Range("F5").Value = myValue 

End Sub 

Dies mir bekommen hat genau das, was ich will für ‚Tabelle1‘ - fügt eine Spalte (F) und gibt einen Header-Namen über das Dialogfeld in der Zelle angegeben F5 beim Kopieren der Formatierung aus der Spalte sofort nach rechts. Alles, was es für Sheet2 tut (und alle anderen, aber aus Platzgründen entfernt), ist das Hinzufügen in einer Spalte, ohne die Formatierung von rechts zu kopieren oder den im Dialogfeld angegebenen Text hinzuzufügen.

Anfänger VBA "Programmierer" und haben so weit durch die Verwendung der Foren hier.

Hoffentlich war ich klar - danke für jede Eingabe.

+0

Sie können versuchen, Ihr Sheet Array 'Sheets (Array (0)) ... und Sheets (Array (1)) zu durchlaufen.' Wenn Sie mehr als zwei Sheets verwenden, verwenden Sie einen Loop wie 'For i = 0 To NumberOfWorksheets' –

+0

Dies ist ein * perfektes * Beispiel dafür, warum Sie die Verwendung von '.Select' vermeiden sollten (https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba -Makros). *** Ich empfehle dir dringend, das zu lesen und es auf dein Makro anzuwenden. Wenn Sie danach feststecken oder Fehler bekommen, lassen Sie es mich wissen. – BruceWayne

Antwort

2

Nur Schleife durch Array("Sheet1", "Sheet2"). Durch Hinzufügen des Parameters Type:=2 zur InputBox wird sichergestellt, dass myValue immer eine Zeichenfolge ist. Wenn der Benutzer die InputBox löscht, dann myValue = "".

Sub CommandButton2_Click() 
    Dim ws 
    Dim myValue As Variant 

    myValue = Application.InputBox(Prompt:="Enter Thought Leadership Title", Title:="New Thought Leadership", Default:="XXXXX", Type:=2) 

    If myValue <> "" Then 
     For Each ws In Array("Sheet1", "Sheet2") 
      With ws 
       .Columns("F:F").Insert Shift:=xlToRight 
       .Range("F5").Value = myValue 
      End With 
     Next 
    End If 

End Sub 
2

Eine Alternative zu @ThomasInzina ist dies:

Sub commandButton2_Click_Test() 
Dim myValue As Variant 

For Each Worksheet In ActiveWorkbook.Worksheets 
    With Worksheet 
     .Range("F:F").EntireColumn.Insert shift:=xlToRight, copyOrigin:=xlFormatFromRightOrBelow 
     myValue = InputBox("Enter Thought Leadership Title", "New Thought Leadership", "XXXXX") 

    End With 
Next Worksheet 
Worksheets("Sheet1").Range("F5").Value = myValue ' I'm not sure where you wanted this, 
Worksheets("Sheet2").Range("F5").Value = myvalue ' or what it does, so tweak as necessary. 
End Sub 

Ich habe versucht, es so ähnlich wie möglich, um Ihren Code zu halten, während .Select zu vermeiden (wie in meinem Kommentar unten OP erwähnt).

Hinweis: Dies wird durchlaufen alle Arbeitsblätter in Ihrer Arbeitsmappe. Sie können eine Zeile If worksheet.name = "Sheet1" or worksheet.name = "Sheet2" hinzufügen, um sie nur auf diesen auszuführen.

+0

(a) Ich denke, das OP möchte die gleichen Überschriften auf jedem Blatt haben, also sollten Sie die Einstellung von myValue außerhalb der Schleife verschieben. (b) Bis wir Quantencomputing haben, wo ein Sheet-Name gleichzeitig "Sheet1" und "Sheet2" sein kann, ** scheitert jeder ** Arbeitsblatt-Name an einem der beiden Tests in Ihrer vorgeschlagenen If-Anweisung. Ich denke, es muss 'If Arbeitsblatt.Name =" Sheet1 "oder Arbeitsblatt.Name =" Sheet2 "' sein. – YowE3K

+0

@ YowE3K - Gute Punkte! Danke für die, die ich bearbeiten werde. (Ich habe das von meinem Kopf entfernt und kann mich nie mehr an den besten Weg erinnern, den 'if-Blatt-Namen zu benutzen ...', also danke!) – BruceWayne

+0

Sie haben hat die falsche Sache aus der Schleife bewegt. Du hast die Einstellung der Überschrift verschoben, aber es sollte in der Schleife gemacht werden, und du hast die InputBox in der Schleife gelassen, aber es sollte nur einmal gemacht werden. Ich werde deine Antwort bearbeiten. – YowE3K