2016-07-20 5 views
1

複数のワークシートの同じ場所に列を追加するExcelマクロ(ボタン)を作成しています。また、この列には、ダイアログボックスで入力する列ヘッダーが必要です。Excel VBA - 複数のワークシートにテキストと書式設定した新しい列を追加する

各ワークシートには、同じ形式の表が含まれています。唯一の違いはワークシート名です。ここで

私がこれまで持っているものです。

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 

これは私が「Sheet1の」の望むまさに私を得ている - 列(F)を追加し、細胞内にダイアログボックスで指定したヘッダ名を入力F5キーを押しながら、書式設定を列のすぐ右にコピーします。しかし、Sheet2(と他のすべての場合、それは簡潔さのために削除されています)は、右から書式をコピーしたり、ダイアログボックスで指定されたテキストを追加することなく、列に追加されます。

初心者のVBA「プログラマー」とここまでのフォーラムを使ってこれまでに得たことがあります。

うまくいけば、私は明確になりました - どんな入力にも感謝します。

+0

シート配列 'シート(配列(0))...とシート(配列(1))'をループすることができます。2つ以上のシートがある場合は、 'For i = 0 To NumberOfWorksheets' –

+0

これは、[.Select'の使用を避けるべき理由の*完全な例です(https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba -macros)。私は***非常に***それを読んで、あなたのマクロに適用することをお勧めします。その後、あなたが立ち往生している/エラーが出たら、私に知らせてください。 – BruceWayne

答えて

2

ちょうどループArray("Sheet1", "Sheet2")をループします。 Type:=2パラメータをInputBoxに追加すると、myValueは常に文字列になります。ユーザーがInputBoxをキャンセルした場合、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

@ThomasInzinaに代わるものはこれです:

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 

(OP以下の私のコメントで述べたように).Selectを回避しながら、私は、可能な限りあなたのコードと同様にそれを維持しようとしました。

注:ブック内のすべてのワークシートをループします。 If worksheet.name = "Sheet1" or worksheet.name = "Sheet2"という行を追加して実行することができます。

+0

(a)OPはすべてのシートで同じ見出しが必要だと思うので、ループ外でmyValueの設定を移動する必要があります。 (b)「Sheet1」と「Sheet2」の両方のシート名を同時に使用できる量子コンピューティングが実現するまで、** **の**ワークシート名は、提案されたIf文の2つのテストのいずれかで失敗します。私は、 'worksheet.name =" Sheet1 "またはworksheet.name =" Sheet2 "'である必要があると思います。 – YowE3K

+0

@ YowE3K - 良い点!おかげで、私は編集します(私は頭の上からそれを固定し、 'if sheet name is ...'をする最善の方法を思い出すことができないので、ありがとう!) – BruceWayne

+0

あなたはループから間違ったものを移動しました。見出しの設定を移動しましたが、ループ内で実行する必要があります。また、InputBoxをループ内に置いたままにしておく必要があります。あなたの答えを編集します。 – YowE3K

関連する問題