2017-01-27 5 views
-1

私は3つのマクロを別々に動作させていますが、それらを一緒に挟むと、最初のマクロだけが正しく実行されます。私は間違いがない。他の2つのマクロは実行されていないようです。それらをリンクする方法についてのアドバイスは、一度にすべてを実行できますか?3つのマクロを1つのVBAコマンドにスタックする


マクロ1

Sub Update_Workbook() 
Dim QryStr As String, cell As String 
Dim a As Integer, b As Integer 
Dim cellv As Variant 

'Pause spreadsheet calculations until end of sub 
Application.Calculation = xlManual 

ActiveWorkbook.Sheets("Raw Data").Select 

'Clear cells to import query 
With Range("A1:O1").EntireColumn 
    .ClearContents 
    .NumberFormat = "General" 
    .Validation.Delete 
End With 

'Process SQL query string 
QryStr = ActiveSheet.TextBox1.Value 
Do While InStr(QryStr, "{&") 
    a = InStr(QryStr, "{&") 
    b = InStr(a, QryStr, "}") 
    cell = Mid(QryStr, a + 2, b - a - 2) 
    cellv = Range(cell).Value 
    If IsDate(cellv) Then 
     cellv = Format(cellv, "dd-mmm-yy") 
    End If 
    QryStr = Replace(QryStr, "{&" & cell & "}", cellv) 
Loop 

'Import data from query 
    With ActiveSheet.QueryTables.Add(Connection:="ODBC;DRIVER={Oracle in OraClient11g_home1};UID=xx;PWD=xx;SERVER=xx;DBQ=xx", _ 
    Destination:=Range("A1"), Sql:=QryStr) 
    .MaintainConnection = False 
    .BackgroundQuery = False 
    .RefreshStyle = xlOverwriteCells 
    .Refresh 
    .Delete 
End With 
Finish_Sub: 
Call ClearUnneededNames 
Application.Calculation = xlCalculationAutomatic 
End Sub 
Sub ClearUnneededNames() 
Dim savedNames As Integer 
savedNames = 0 
Do While ActiveSheet.Names.Count > savedNames 
    If InStr(ActiveSheet.Names(savedNames + 1).Name, "ExternalData") = 0  Then 
     savedNames = savedNames + 1 
    Else 
     ActiveSheet.Names(savedNames + 1).Delete 
    End If 
Loop 
End Sub 

マクロ2

Sub Five_Felicia_for_MFG() 
' 
' Macro3 Macro 
' 

' 
Range("A3:M3").Select 
Range(Selection, Selection.End(xlDown)).Select 
Range(Selection, Selection.End(xlDown)).Select 
Range(Selection, Selection.End(xlUp)).Select 
Range(Selection, Selection.End(xlDown)).Select 
ActiveWindow.SmallScroll Down:=-18 
Range(Selection, Selection.End(xlUp)).Select 
Range("A3:M1010").Select 
Selection.Delete Shift:=xlUp 
Sheets("5Felicia").Select 
Range("A3:M34").Select 
Selection.Copy 
Sheets("5Felicia for MFG").Select 
Range("A3").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ 
    SkipBlanks:=False, Transpose:=False 
Sheets("5Felicia").Select 
Range("A37:M37").Select 
Range(Selection, Selection.End(xlDown)).Select 
Range("A37:M692").Select 
Application.CutCopyMode = False 
Selection.Copy 
Sheets("5Felicia for MFG").Select 
ActiveWindow.SmallScroll Down:=18 
Range("A36").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ 
    SkipBlanks:=False, Transpose:=False 
ActiveWindow.SmallScroll Down:=-48 
Columns("A:M").Select 
Application.CutCopyMode = False 
ActiveSheet.Range("$A$1:$M$691").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5, 6, _ 
    7, 8, 9, 10, 11, 12, 13), Header:=xlNo 
End Sub 

マクロ3

Sub DUMMY_ITEMS() 
' 
' DUMMY_ITEMS Macro 
Dim LastRow As Long 

Sheets("Operations").Range("H2:V73").Copy 

With Sheets("Raw Data") 
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
.Range("A" & LastRow + 1).PasteSpecial xlPasteValues 
End With 

End Sub 
+4

あなたは*一緒に*リンクすることは何も意味しません。 *順番に実行することを意味しますか? 3つの既存のマクロを1つずつ呼び出す新しいマクロを作成します。呼び出していないコードを表示していないコードがある場合は、デバッガを使用してコードを実行して理由を調べます。 –

+0

マクロ1にコピー・ペースト・エラー(または構文エラー)があります。 – Comintern

+2

ブレークポイントを設定して実行し、何が起こるかを確認します。 「サンドイッチ一緒」または「実行されていない」と表示されません。 –

答えて

1

VBAでは、モジュールにいくつかのマクロ(より正確にはサブルーチン)を含めることができます。

ただし、これらのマクロのいずれかを呼び出すと、実行は、End Subステートメントでを停止します。モジュール内の他のものは、それらをモジュール内でどのように「サンドイッチ」しているかにかかわらず実行されません。

しかし、サブルーチンは他のサブルーチンを呼び出すことができます。したがって、このようなコードでは、3つのマクロがすべて実行されます。

Sub RunAllThree() 
    Update_Workbook 
    Five_Felicia_for_MFG 
    DUMMY_ITEMS 
End Sub 
関連する問題