エクセルでの複数VBAの作業

このQ&Aのポイント
  • エクセルでの複数VBAの作業について詳しく教えてください。
  • VBAを使用して、エクセルでの複数の処理を行いたい場合、どのようにすれば良いですか?
  • エクセルでVBAを使って複数のタスクを自動化する方法について教えてください。
回答を見る
  • ベストアンサー

エクセルでの複数VBAの作業

 こんばんは。  お世話になります。  以下のコードをMicrosoft Visual Basicの「標準モジュール画面」にて記述し、作動させてみたのですが、  2つ目のSub lll()のみしか反映されないようで、”S”行のみしか値がえられませんでした。  何が問題なのか、初心者のわたくしには、わかりません。  お手数ですが、原因等をお教えいただければ、幸いでございます。 Sub hhh() Dim n As Long Dim rng As Range n = 2000 ReDim hh(1 To n, 1 To 1) Set rng = Range("C2:C31") For i = 1 To n hh(i, 1) = WorksheetFunction.Max(rng) Set rng = rng.Offset(30) Next i Range("R2").Resize(n) = hh End Sub Sub lll() Dim n As Long Dim rng As Range n = 2000 ReDim ll(1 To n, 1 To 1) Set rng = Range("D2:D31") For i = 1 To n ll(i, 1) = WorksheetFunction.Min(rng) Set rng = rng.Offset(30) Next i Range("S2").Resize(n) = ll End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

いったいあなたは、今どうやってマクロを実行しているのですか。 基本の手順: ALT+F8を押す hhhを実行する ALT+F8を押す lllを実行する。 このようにしてそれぞれのマクロを実行するのです。 手順: シート上にオートシェイプを1つ配置する 右クリックしてマクロの登録でhhhを登録する シート上に別のオートシェイプを1つ配置する 右クリックしてマクロの登録でlllを登録する hhhを登録したオートシェイプをクリックしてhhhを実行する lllを登録したオートシェイプをクリックしてlllを実行する そもそもなんでhhhとlllと2つ作ったのですか。何の意図も考えていないなら、1つのマクロで作成します。 sub hhhlll()  dim r as long ’おまけ  range("R:S").clearcontents  range("R1:S1") = array("MAX","MIN")   ’本題  for r = 2 to range("C65536").end(xlup).row step 30  range("R65536").end(xlup).offset(1) = application.max(cells(r, "C").resize(30, 1))  range("S65536").end(xlup).offset(1) = application.min(cells(r, "D").resize(30, 1))  next r end sub

nyan_nyanko
質問者

お礼

 実を申しますと、2つにまとめたいのは、元々の希望だったのですが、残念ながら、VBAの知識が足らず、ご質問させていただいた次第でございます。  非常に参考となるコードをお示しになられましたこと、厚くお礼申し上げます。

その他の回答 (3)

回答No.3

Subが並んでいるからといって、それは実行(仕事)の順序(流れ)とは無関係。 実行の順序を制御するのはプログラマの仕事です。 「プロシージャの呼び出し」 http://kabu-macro.com/kouza/macro/macro_yobidasi.html マクロ機能に慣れてより複雑なプログラムを組むようになると、どうしてもVBAコードが長くなってしまいます。 そこで、「各プロシージャを呼び出す」専用のプロシージャを用意し、全体の流れをひと目で把握できるようにしましょう。 以下に2つのプロシージャを用意しました。 VBEを開いて以下のVBAコードを標準モジュールに入力(参考→VBAとは) --------------- Sub プロシージャ1 ()    Range("A1").value = "〇" End Sub --------------- Sub プロシージャ2 ()    Range( "A2").value = "×" End Sub --------------- では、今から上記2「プロシージャを呼び出す」専用のプロシージャを作ってみましょう。 ---------------- Sub プロシージャの呼び出し ()    Call プロシージャ1    Call プロシージャ2 End Sub ---------------- Sub プロシージャ1 ()    Range( "A1").value = "〇" End Sub ---------------- Sub プロシージャ2 ()    Range( "A2").value = "×" End Sub ---------------- 見事に「プロシージャを呼び出す」プロシージャを実行することで2つのプロシージャが実行されましたね。

nyan_nyanko
質問者

お礼

 ご参考資料までいただきまして、どうもありがとうございます。  勉強させていただきます。  厚くお礼申し上げます。

回答No.2

関連を持たないSubを2つ並べても一方しか実行されない。(親のSubを作って2つを呼び出すこともできるが...) MAXとMIN、この2つはどう見ても1つの機能、だからまとめればいい。スッキリする。 勿論、データは1セットしか要らない。 それと、テストならもっとコンパクトにして、視野を確保すべき。ループカウンタは10で十分だし、データはA列(1セット!)、結果はC列とD列だろう。 判らないときは、デバッグする。ステップbyステップ(F8)もできる。変数のウォッチもできる。

nyan_nyanko
質問者

お礼

 ご回答いただきまして、どうもありがとうございました。  何分、初心者なものですから、ご質問させていただいた次第であります。  Subを2つ並べても一方だけしか実行されないのでしょうか?  もし、よろしければ、複数のVBAを同時に実行してくれるものをご紹介いただければ、幸甚に存じます。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

マクロ自体はどちらも正常です。 >2つ目のSub lll()のみしか反映されないようで、”S”行のみしか値がえられませんでした。 S列にとりあえず数字が入ったのは良いとして、肝心の問題のR列は「具体的に目に見える様子」として、いったいどうなったのですか? ○ゼロの羅列が入った場合  C列に「数値」が記入できていないのが原因です  まっさらのシートを用意、C列とD列に数字を記入し、あなたのマクロを実行して正しく作動する事を確認してください  そのうえで改めて問題のシートに戻り、C列とD列を見直すなりデータを入れ直してもう一回やってみます  あるいはもしかするとゼロが記入できているのに、セルの書式設定の表示形式などで表示が目に見えないようにしてしまっているのかも?しれません。セルを選んだ時に数式バーに何某か現れるのでしたら、単に表示の問題です ○数式バーの中も何も無い空っぽのままの場合  hhhを実行していないのが原因です    あるいはもしかすると、ご相談に掲示されたの以外にも他のマクロを一緒に実行していて、R列を消してしまったのかも?しれません。ブックを用意し、もう一度明示的にhhhをただ実行します。  あるいはもしかすると、マクロの使い方が悪くて「他のシート(他のブック)に」結果を出してしまっているのかも?しれません。C列とD列に数字を入れたブックそれ1つだけをエクセルで開き、マクロを実行します。

nyan_nyanko
質問者

お礼

 ご返答いただきましたこと、厚くお礼申し上げます。  なお、数式バーの中が空っぽという結果となっております。  ご指示にもございますように、新たなシート(or ブック)を別途用意し、それで再計算させてみようと思っております。  まずは、取り急ぎ、お礼申し上げます。

nyan_nyanko
質問者

補足

 どうも申し訳ございません。  通常ならば、上述のコードで”R列”と”S列”も同時に埋まっていくはずですよね?  何分、初心者なものですから、根本的な間違いがないかお聞きしたかった次第でございます。  もし、よろしければ、「基本的には、間違いはない」もしくは、「根本的に間違いがある」のご連絡を頂きますれば、幸いでございます。

関連するQ&A

  • エクセル VBA もっときれいな書き方?

    Sub test() Dim i As Integer, n As Integer n = 1 For i = 2 To 150 If Cells(i, 1) <> Cells(i - 1, 1) Then Cells(i - 1, 5) = i - n Cells(i - 1, 6) = Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) n = i End If Next i End Sub 上記のマクロですが Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) この部分、もっとスマートに書く方法を教えてください。 Range("B" & n & ":" & "B" & i - 1)って、ちゃんと動きますが、書き方が何か変なような気がするんです。 よくわかってもいないのにすみません。

  • エクセル自動改行で互換性エラー

    エクセルで、1行35文字以上が記入されると自動で次のセルに改行される 仕様になるようにマクロを組んでいます。 ただ自身はマクロ未経験で、他のところから見様見真似で コードを調整してくっつけただけで、知識はほとんどありません。 そのため、エクセルのバージョンが違うとうまく動作しないようになっています。 どこの記述がおかしいのか、足りないのかわかりません。 制作環境:excel 2010 以下内容です。 ------------------------------------------- ' 改行自動 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Dim TgRng As Range Dim N As Integer Dim Ary() Dim S As String Set TgRng = Range("N10:N26") Set Rng = Intersect(TgRng, Target) If Rng Is Nothing Then Exit Sub Application.EnableEvents = False With Rng.Cells(1) If Len(.Value) > 36 Then S = .Value For N = 0 To Int((Len(S) + 35) / 36) ReDim Preserve Ary(N) Ary(N) = Left(S, 36) S = Mid(S, 37) If S = "" Then Exit For Next .Resize(UBound(Ary) + 1).Value = Application.Transpose(Ary) End If End With Application.EnableEvents = True Set Rng = Nothing Set TgRng = Nothing Erase Ary End Sub ' 切り取り禁止 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Application.CutCopyMode = 2 Then Application.CutCopyMode = 0 End If End Sub -------------------------------------------

  • Excel2000VBAで貼り付け先の取得等・・・

    シートに行数13、列数不定の表が上下に多数配置されてます。表は上下それぞれ2行の空白行で隔てられています。 各表は連続した列の部分でひとつですが、中には複数の表を横にならべて、途中1列の空白列で間隔をあけたものもあります。 この、複数の表を横に並べたものを上下に配置しなおすため、以下のように書きました。 質問です。 1.Dim ans As Variantは 'variantで正しいですか? 2.15行(13行+間隔用2行)挿入にForNext以外にいい方法はないですか? 3.切り取った部分を貼り付ける際、Set XRng = SelectionでなくセレクトせずにXRngを取得できませんか? 他に指摘事項があればお願いします。 Sub TEST() Dim ans As Variant Dim Rng As Range, XRng As Range Dim c As Integer, b As Integer, i As Integer, n As Integer, x As Integer ans = MsgBox("分離したい表を選択してある?", vbYesNo + vbQuestion) If ans = vbNo Then Exit Sub Set Rng = Selection b = Application.CountBlank(Range(Rng(2, 1), Rng(2, Rng.Columns.Count))) '分離する数を取得 Set XRng = Rng For i = 1 To b'分離する数だけ繰返し For n = 1 To 15 '行挿入 XRng.Offset(14, 0).Resize(1, 1).EntireRow.Insert Shift:=xlDown Next n c = XRng.Columns.Count '列数取得 x = Range(XRng(1, 1), XRng(1, 1).End(xlToRight)).Columns.Count '最左側部分の列数取得 XRng.Offset(0, x + 1).Resize(13, c - x - 1).Cut '右側カット Rng.Offset(15 * i, 0).Resize(1, 1).Select '貼付け開始位置セレクト ActiveSheet.Paste '貼付け Set XRng = Selection 'XRng再取得 Next i End Sub

  • エクセル VBA 表示範囲の簡素化

    よろしくお願いします。 下記構文の簡素化ができないでしょうか。 CommandButtonが30個ほどあります。 ーーーーーーーーーー Private Sub CommandButton1_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A1:D7") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton2_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("A8:B21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub ーーーーーーーーーー Private Sub CommandButton3_Click() Dim rng As Range Application.Goto Sheets("基本台紙").Range("A1") Set rng = Range("C8:D21") Rows.Hidden = True rng.EntireRow.Hidden = False Columns.Hidden = True rng.EntireColumn.Hidden = False rng(1).Select Unload Me UserForm1.Show vbModeless End Sub

  • エクセルVBAでTransposeの不思議

    MS Officeのエクセル2000です。 下記Sub test01はRange("A1:I1")に文字列を入力し、一旦配列に取り込んでからワークシートに貼り付けるものです。 試験用のコードですので意味はありません。 このコードで255文字まではまったく問題はありません。 ところが、256文字以上の場合、横に貼り付けは問題ないのですが、 Transposeで縦に変換すると型が一致しません。(Error 13)となります。 どうしてでしょうか? 試行錯誤の結果、Sub test02のように一旦横に貼ったデータをコピーしてTransposeして貼り付けるのは大丈夫のようですので不思議でしょがありません。 またこの方法は列数256より要素が多い配列には使えないので解決策にはなりません。 ご教示くださいませ。 Sub test01() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A5").Resize(UBound(myAr, 2)).Value = Application.Transpose(myAr) '256文字の場合エラー End With End Sub Sub test02() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A3").Resize(, UBound(myAr, 2)).Copy .Range("A5").PasteSpecial Paste:=xlValues, Transpose:=True '256文字の場合もOK Application.CutCopyMode = False End With End Sub

  • エクセル(2003)のVBAに関する質問です。

    エクセル(2003)のVBAに関する質問です。 例えば、B列からW列のある特定の行数までの表があるとします。 表の一番下の行(B列からW列)を368行までオートフィルを行うマクロを 以下のように考えましたが実行時エラーがでてしまいます。 Private Sub Workbook_Open() Dim rng As Range Set rng = Cells(Rows.Count, "B").End(xlUp).Resize(1, 21) rng.AutoFill Destination:=Range(rng, "W368"), Type:=xlFillSeries End Sub 初歩的な質問で恐縮ですが、ぜひ解決方法を教えて下さい。

  • VBAのcountif

    ここで質問させていただき、配列に必要なデータを入力する所までは出来ました。 次に各行ごとの"OK"の数をカウントしたいのですが、どのように記述すればよいのでしょうか? Sub count0(a, b, c, d, e)  Dim i1 As Long  Dim i2 As Long  Dim A1 As String  Dim bb As Variant  Dim cc As Variant  Dim dd As Variant  Dim ee As Variant  Dim myLastRow As Long  Sheets(a).Select  myLastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1  bb = Range(b).Resize(myLastRow, 6)  cc = Range(c).Resize(myLastRow, 6)  dd = Range(d).Resize(myLastRow, 6)  ee = Range(e).Resize(myLastRow)  For i1 = 1 To myLastRow   For i2 = 1 To 6    If bb(i1, i2) = "" Then      A1 = "NG"     ElseIf bb(i1, i2) = "A1" Or cc(i1, i2) = "A1" Then      A1 = "-"     ElseIf bb(i1, i2) = cc(i1, i2) Then      A1 = "OK"     Else      A1 = "NG"    End If    dd(i1, i2) = A1   Next i2 '配列をカウントするこの行以降の記述が良く分かりません。   ee(i1) = Application.WorksheetFunction.CountIf(dd(), "OK")  Next i1  Range(e).Resize(myLastRow) = ee End Sub

  • Excel VBA_2000ハイパーリンク付文書を選択後,各フォルダへ

    Excel VBA_2000ハイパーリンク付文書を選択後,各フォルダへ分別振分保存について (http://okwave.jp/qa/q6003799.html) (http://okwave.jp/qa/q6058720.html)で大変お世話になった者です。Sheets("TEST")E列に1~8の数字あります。これを判断して実行時に,C・D列のハイパーリンク付文書をE列に1とあれば1.管理aフォルダに保存,以下,2の時は2.管理bへ保存としたいのです。どのように変更すれば良いでしょうか?どうぞ宜しくお願い致します。 Sub try() Dim BookUrl As String Dim BookName As String Dim n As String Dim Rng As Range Dim H As Hyperlink Dim hLink As String Dim xName As String Dim Holdir As String Dim kk() As String Dim i As Integer Dim returnValue As String ActiveSheet.Unprotect With Sheets("TEST") If Not .AutoFilterMode Then Exit Sub If Not .FilterMode Then MsgBox "B25のオートフィルタボタンからレ点を選択してください。" Exit Sub End If Set Rng = Intersect(.AutoFilter.Range.EntireRow, .Columns("C:D")) BookUrl = .Range("D10").Value n = "_" & .Range("C3").Value End With With Sheets("TEST") ActiveSheet.Shapes("Button 36").Select On Error Resume Next MkDir Range("D10") & "7.資料" MkDir Range("D10") & "7.資料" & "\" & "1.管理a" MkDir Range("D10") & "7.資料" & "\" & "2.管理b " MkDir Range("D10") & "7.資料" & "\" & "3.管理c" MkDir Range("D10") & "7.資料" & "\" & "4.管理d" MkDir Range("D10") & "7.資料" & "\" & "5.管理e" MkDir Range("D10") & "7.資料" & "\" & "6.管理f" MkDir Range("D10") & "7.資料" & "\" & "7.管理g" MkDir Range("D10") & "7.資料" & "\" & "8.管理h" On Error GoTo 0 End With Set Rng = Intersect(Rng, Rng.Offset(1), Rng.SpecialCells(xlCellTypeVisible)) If Rng Is Nothing Then Exit Sub UserForm1.Show vbModeless UserForm1.Repaint '■※1)画面更新停止 Application.ScreenUpdating = False 'rng.HyperlinksをLoop For Each H In Rng.Hyperlinks hLink = H.Address If UCase(Right$(hLink, 3)) = "XLS" Then xName = Mid$(hLink, InStrRev(hLink, "/") + 1) ReDim kk(8) kk(0) = "1.管理a" kk(1) = "2.管理b" kk(2) = "3.管理c" kk(3) = "4.管理d" kk(4) = "5.管理e" kk(5) = "6.管理f" kk(6) = "7.管理g" kk(7) = "8.管理h" For i = 0 To 7 Holdir = "7.資料" & "\" & kk(i) & "\" BookName = BookUrl & Holdir & Replace$( _ xName, ".xls", n & ".xls", , , vbTextCompare) returnValue = URLDownloadToFile(0,hLink,BookName,0,0) H.Address = BookName Next i End If 以下,省略

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • エクセルVBAのオートフィルタについて

    いつもお世話になります。 エクセル2007でVBAでオートフィルタを操作したいのですが、 一部うまくいきません。 以下の様なコードを書いて 日付で絞り込みたいのですが、 何も抽出されません。 リストを見てみると、変数はちゃんと入っており OK ボタンを押すとその日付で抽出されます。 何故VBAでの操作では抽出されないのでしょうか。 ご存じの方がおられましたら、よろしくお願いします。 Sub test() Dim mydate As Variant Dim rng3 As Range Dim fmt As Variant Dim objList3 As ListObject Dim wb1 As Workbook Dim wb2 As Workbook Dim wb4 As Workbook Dim sh1 As Worksheet Dim sh2 As Worksheet Dim sh3 As Worksheet Dim sh4 As Worksheet Dim sh7 As Worksheet '----------------------------------------------------------------------- Set wb1 = Workbooks("301.xlsm") Set wb2 = Workbooks("1.xls") Set wb4 = Workbooks("2.xls") Set sh1 = wb1.Worksheets("@") Set sh2 = wb1.Worksheets("@@") Set sh3 = wb2.Worksheets("@@@") Set sh4 = wb2.Worksheets("@@@@") Set sh7 = wb4.Worksheets("@@@@@") '---------------------------------------------------------- sh2.Range("A1:z63").ClearContents With sh7 Set objList3 = .ListObjects("リスト1") fmt = .Range("A2").NumberFormatLocal mydate = Format(mydate, fmt) objList3.Range.AutoFilter Field:=7, Criteria1:=mydate objList3.Range.AutoFilter Field:=5, Criteria1:="test" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A2") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=5, Criteria1:=">=190" Set rng3 = objList3.Range.SpecialCells(xlCellTypeVisible) rng3.Copy sh2.Range("A20") objList3.Range.AutoFilter Field:=5 objList3.Range.AutoFilter Field:=7 End With Application.CutCopyMode = False Set rng3 = Nothing Set fmt = Nothing Set objList3 = Nothing Set wb1 = Nothing Set wb2 = Nothing Set wb4 = Nothing Set sh1 = Nothing Set sh2 = Nothing Set sh3 = Nothing Set sh4 = Nothing Set sh7 = Nothing End Sub (一部省略しています)

専門家に質問してみよう