エクセルのVBAで簡潔に表示させる方法を教えてください

このQ&Aのポイント
  • エクセルのVBAで簡潔に表示させたい方法や関数について教えてください。メンテナンスが困難なため、効率的な方法を知りたいです。
  • 現在、エクセルのVBAで指定の範囲に対して特定の計算をしていますが、これを簡潔に行う方法はありませんか?
  • エクセルのVBAで繰り返し作業を簡単に行う方法を知りたいです。50回ほど繰り返す作業を簡単に記述したいです。
回答を見る
  • ベストアンサー

エクセルのVBAで簡潔に表示させたいのですが、知恵を貸してください。

エクセルのVBAで簡潔に表示させたいのですが、知恵を貸してください。 エクセルのVBAで現在、下記のような指示をしています。 メンテナンスが困難なため、簡潔に記載する方法または関数を教えていただけないでしょうか。 activesheet.range("c2")= "=sumproduct(('[nen.xls]1'!c4)*1)" activesheet.range("d2")= "=sumproduct(('[nen.xls]1'!d4)*1)" activesheet.range("e2")= "=sumproduct(('[nen.xls]1'!e4)*1)" activesheet.range("f2")= "=sumproduct(('[nen.xls]1'!f4)*1)" activesheet.range("g2")= "=sumproduct(('[nen.xls]1'!g4)*1)" activesheet.range("c3")= "=sumproduct(('[nen.xls]1'!c5)*1)" activesheet.range("d3")= "=sumproduct(('[nen.xls]1'!d5)*1)" activesheet.range("e3")= "=sumproduct(('[nen.xls]1'!e5)*1)" activesheet.range("f3")= "=sumproduct(('[nen.xls]1'!f5)*1)" activesheet.range("g3")= "=sumproduct(('[nen.xls]1'!g5)*1)" activesheet.range("c4")= "=sumproduct(('[nen.xls]1'!c6)*1)" activesheet.range("d4")= "=sumproduct(('[nen.xls]1'!d6)*1)" activesheet.range("e4")= "=sumproduct(('[nen.xls]1'!e6)*1)" activesheet.range("f4")= "=sumproduct(('[nen.xls]1'!f6)*1)" activesheet.range("g4")= "=sumproduct(('[nen.xls]1'!g6)*1)" ・ ・ このパターンを全部で50回ほど繰り返します。 ・ ・  この繰り返し作業を簡単な記述に変更したいのですが、できません。  お知恵をお貸しください。よろしくお願いいたします。

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

関数SUMPRODUCTの使い方をちゃんと確認したほうが良いです。 SUMPRODUCTは、複数の配列を引数として指定して、その配列要素間の積の和を求める関数です。 それはそれとして、VBAで簡素にやるのならただ一行↓で良いかと ActiveSheet.Range("C2:G10").FormulaR1C1 = "=SUMPRODUCT(('[nen.xls]1'!R[2]C[0])*1)"

demiguru
質問者

お礼

ありがとうございます。 簡潔ですっきりとしたものになりました。 ありがとうございます。

demiguru
質問者

補足

回答ありがとうございます。 関数SUMPRODUCTですが本当は使いたくないのですが、他のexcelファイルからデータを取り出す際にどうしても利用しないとうまく作動しないので利用しています。 ありがとうございました。

その他の回答 (2)

  • t_nojiri
  • ベストアンサー率28% (595/2071)
回答No.2

http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_02.html 少しだけ意地悪ですが、VBA基本なのでループ文とかは自分で書きましょう。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

列はC~Gの固定、行は2~のようですね。 Dim 行 As Long Dim 列 As Long Dim 字 As String Dim 式 As String For 行 = 2 To x   For 列 = 3 To 7     字 = Chr(&h60 + 列)     式 = ""=sumproduct(('[nen.xls]1'!"     式 = 式 & 字 & CStr(行 + 2) & ")*1)"     ActiveSheet.Range(字 + CStr(行)) = 式   Next Next Xは最終行位置です。

関連するQ&A

  • エクセルで、他のエクセルのワークシートからデータを取り込む方法について

    エクセルで、他のエクセルのワークシートからデータを取り込む方法について 現在、下記のようなコードを考えているのですが、他のファイルからの取り込みがうまくいきません。 nen,xlsというエクセルのシート名11のc4:g45までを取り込みたいのですが、コピーされた値が「'\\sv1\sv\" & today & "\[nen.xls]11'!c4:g45」となってしまいます。 アドバイスをいただければと思います。 Dim wStr As String today = Format(Now(), "m月d日") dve = ThisWorkbook.Path ActiveSheet.Range("c261:g310").Formula = "='\\sv1\sv\" & today & "\[nen.xls]11'!c4:g45" Dim td, x td = Day(Date) x = (td - 1) * 5 + 8 MsgBox "今日は" & td & "日です。" With ActiveSheet .Range("c261:g510").Copy .Cells(3, x).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone End With Excel.Application.CutCopyMode = False 以上です。

  • エクセルでファイルが保存されているドライブの値を表示したい

    エクセルのマクロを利用して、ファイルが保存されているドライブの値を取りたいのですがうまくいきません。 皆さんのお知恵をお貸しください。 下記のようなマクロを利用して、ネットワーク上の共有ファイルに置いてあるエクセルを自動更新させたいと考えています。 各クライアントには、ネットワークドライブとして共有ファイルが設定されており、クライアントごとに割り振られているドライブ名が異なっています。 試行錯誤で単体では、うまくいくようになりました。 Sub auto_open() Dim wStr As String today = Format(Now(), "m月d日") atai1 = ActiveWorkbook.FullName atai2 = Left(atai1, 1) ActiveSheet.Range("c2") = "=SUMPRODUCT(('atai2 & \出欠関係\" & today & "\[1nen.xls]11'!l4:l45=1)*1)" 単体では下記の記述でした。 ActiveSheet.Range("c7") = "=SUMPRODUCT(('F:\出欠関係\" & today & "\[1nen.xls]11'!l4:l45=6)*1)"

  • エクセルでカレントドライブの値を知る方法を教えてください

    Excel(2003)で開いているファイルのカレントドライブの値を知る方法を教えてください。 現在、下記のようなマクロを実行しています。 ActiveSheet.Range("c2") = "=SUMPRODUCT(('F:\出欠関係\" & today & "\[1nen.xls]11'!l4:l45=1)*1)" ActiveSheet.Range("d2") = "=SUMPRODUCT(('F:\出欠関係\" & today & "\[1nen.xls]12'!l4:l45=1)*1)"    ・    ・    ・    ・    ・ 利用し始めた当初はよかったのですが、複数のコンピュータから利用することになり共有フォルダに割り当てされているドライブ名が異なっており、マクロの中の「F:\出欠関係」が上手く利用できません。 利用する端末の数が多いためドライブ名を変えるのではなく、マクロで乗り切りたいと思っております。フォルダの名称や位置は固定です。 是非アドバイスをお願いいたします。

  • excel vbaの関数の使い方

    excel VBAでsumproduct関数を使いたいがでますのですがどうしても実行できません 何が原因でしょうか、どなたか教えてください。 ------------------------------------------------- 下記コードは実行できます。 Worksheets("集計").Range("j4").Value = WorksheetFunction.Sum(Worksheets("日常").Range("h4:h13")) 下記コードは型が違うとのコメントがでます。 Worksheets("集計").Range("j4").Value = WorksheetFunction.SumProduct((Worksheets("日常").Range("c4:c13") >= j2) * Worksheets("日常").Range("c4:c13") <= k2) * Worksheets("日常").Range("d4:d13") = l2 * Worksheets("日常").Range("f4:f13") = m2 * Worksheets("日常").Range("h4:h13") --------------------------------------------------------------------- ワークシートは、日常、集計、の二つがあります。 「日常」には、C4:H13にデータがあります。 c列に年月日、d列にコード番号、e列に購入箇所、f列にコード番号、g列に商品、h列に金額 が入力されています。 「集計」には、j2に開始日、k2に終了日、l2にd列のコード番号、m2にf列のコード番号、 が入力されています。 環境は、windows10 使用しています。 ----------------------------------------------------------- 以上の状況ですがvba でsumproduct関数を使いたいのですが実「実行」できません,たかどなたか教えて頂けませんか。

  • エクセルのVBAで悩んでいます。

    いつもありがとうございます。 エクセルのVBAで悩んでいます。 セルの範囲指定をVBAで行いたいのです。 ただし、引数に数値変数を使用する為、Cellsプロパティを使います。 すると、離れている範囲の範囲指定が出来ないのです。 例えば、Rangeプロパティだと、 Range("A5:E5,A9:E32").Select こうなるところを、 A9:E32 を変数に置き換えたくて、 Range("A5:E5", Cells(g, 1), Cells(h, 5)).Select と、するとエラーが出ます。 VBAの前文は次の通りです。 Private Sub CommandButton1_Click() a = Me.TextBox1.Value b = Me.TextBox2.Value Set c = Range("a:a").Find(what:=a, LookIn:=xlValues, lookat:=xlWhole) Set d = Range("a:a").Find(what:=b, LookIn:=xlValues, lookat:=xlWhole) 'MsgBox c + d e = c.Address 'MsgBox e f = d.Address 'MsgBox f g = Range(e).Row MsgBox g h = Range(f).Row MsgBox h Range(Cells(g, 1), Cells(h, 5)).Select End sub よろしくお願い致します。

  • エクセルVBAの保存

    毎月異なった新しいエクセルファイルに同じような加工を施すため、VBAを書きました。対象はActivesheetとしています。 で、質問は、この新しいエクセルファイルの標準モジュールにいちいちこのVBAをコピーペーストせずに実行する方法です。 きっと何かあるとは思うのですが・・・・。 VBAは次のような簡単なものです。 Sub 加工1() Dim e As Integer, s As String, n As String e = Range("A4").End(xlDown).Row s = Replace(Mid(Range("A2"), 8, 5), "年", "") & "-" n = Replace(Mid(Range("A2"), 19, 5), "年", "") & "-" Range("A1:C2").MergeCells = False Columns("B:B").Select Selection.Insert Shift:=xlToRight Columns("A:A").Select Selection.Insert Shift:=xlToRight Columns("C:C").Select Selection.NumberFormatLocal = "G/標準" Range("B3").Select Selection.AutoFill Destination:=Range("B3:C3"), Type:=xlFillDefault Range("B3").Select ActiveCell.FormulaR1C1 = "商品番号1" Range("C4").Select ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],10)" Range("C4").Select Selection.AutoFill Destination:=Range("C4:C" & e), Type:=xlFillDefault Range("A3").Select ActiveCell.FormulaR1C1 = "抽出年月日" Range("A4").Select ActiveCell.FormulaR1C1 = s & n & 1 Range("A4").Select Selection.AutoFill Destination:=Range("A4:A" & e), Type:=xlFillDefault Rows("3:3").Select Selection.Insert Shift:=xlDown Range("B1:E1").MergeCells = True Range("B2:E2").MergeCells = True ActiveSheet.Name = "提出用" End Sub

  • Excel VBAについて

    Excel VBAについて教えて頂きたいのですが、 Sub test() Dim lastrow, r, i As Long Dim sh1, sh2 As String Dim ws As Worksheet lastrow = Cells(Rows.count, "D").End(xlUp).row For r = 7 To lastrow '7 For i = 1 To lastrow '4 sh1 = ActiveSheet.Cells(r, 4) ActiveSheet.Cells(r, 20) = _ Application.CountIfs(Sheets(sh1).Range("D:D"), Range("H3") & Range("I3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("D:D"), Range("H3") & Range("I3")) ActiveSheet.Cells(r, 21) = _ Application.CountIfs(Sheets(sh1).Range("C:C"), Range("F3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("C:C"), Range("F3")) ActiveSheet.Cells(r, 22) = _ Application.CountIfs(Sheets(sh1).Range("E:E"), Range("K3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("E:E"), Range("K3")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") ActiveSheet.Cells(r, 15) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") - 200 ActiveSheet.Cells(r, 18) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") + 200 ActiveSheet.Cells(r, 19) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) For Each ws In Worksheets ws.AutoFilterMode = False Next Next Next End Sub このコードは ActiveSheetで実行すると D列の7行目から最終行までに入力されている名前のシート(名前=シートがあります) その、シートの参照先で C,D,E列がcountif関数を利用して O列がSubtotal関数を利用しています。 このコードでもやりやいことは実行できるのですが、 時間がかかりすぎてしまいます。 約20件あり約2分ほどかかります。パソコンによっては倍ほど時間がかかるかもです。 そこでなのですが、 もっと処理のスピードを上げたいのですが、 可能でしょうか? 可能ならそのやり方をご教示ください。 よろしくお願い致します。

  • エクセルで繰り返し同じ作業をしたい

    仕事でDドライブの中のフォルダにエクセルのシートが100種類位入っています。それらのエクセルシートに毎日同じ作業をしなければならないのですが、(エクセルを開いて行う作業は各シート共通です)そのマクロの作り方を教えていただけないでしょうか?ちなみに Workbooks.Open Filename:="D:\業務\あ.xls" Range("D9").Select Selection.Copy Range("E9").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.Save ActiveWindow.Close Workbooks.Open Filename:="D:\業務\い.xls" Range("D9").Select Selection.Copy Range("E9").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.Save ActiveWindow.Close Workbooks.Open Filename:="D:\業務\う.xls" Range("D9").Select Selection.Copy Range("E9").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.Save ActiveWindow.Close      その後もまだまだ続きます。 というマクロの記録を使って作ってはいるものの、やたらと長くなってしまいます。VBAの知識がない初心者なのですが、いい方法があれば教えていただけないでしょうか?

  • EXCELのVBAについて

    マクロのボタンで内容を削除する様に設定した所、 Dim re As Integer Sheets("投入シート").Select re = MsgBox("入力データをクリアします。" & vbCrLf & vbCrLf & "よろしいですか?", vbOKCancel, "クリア確認") If re <> vbCancel Then Sheets("投入シート").Select ActiveSheet.Unprotect Range("a1:c30").Select Selection.Copy Application.CutCopyMode = False Selection.Copy Sheets("work").Select Range("A1").Select ActiveSheet.Paste Sheets("投入シート").Select ActiveSheet.Unprotect Range("c4:c30").Select Selection.ClearContents Range("f31").Select Selection.Copy Range("c9").Select ActiveSheet.Paste Range("f33").Select Selection.Copy Range("c11").Select ActiveSheet.Paste Range("f32").Select Application.CutCopyMode = False Selection.Copy Range("c14").Select ActiveSheet.Paste Range("c4").Select Application.CutCopyMode = False 'ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End If Sheets("投入シート").Select Range("c4").Select End Sub この様に入力したのですがセルのC11の計算式だけセル番号が消えてしまいます。 どうしてでしょうか?ご指導をお願いします。

  • エクセルでマクロを実行するかしないか選択するように設定したい

    エクセルで、ワークブックが開くのにあわせてマクロが実行されるようにしています。この動作を実行するかしないかを選択するようにしたいのですが方法がわかりません。 申し訳ないのですが、皆さんのお知恵をお貸しください。 実行しているマクロは、下記のようなマクロです。 Sub auto_open() Dim wStr As String today = Format(Now(), "m月d日") dve = ThisWorkbook.Path ActiveSheet.Range("c2") = "=SUMPRODUCT(('P:\" & today & "\[1nen.xls]11'!l4:l45=1)*1)" ・ ・ ・ ・ Dim td, x td = Day(Date) x = (td - 1) * 11 + 14 MsgBox "今日は" & td & "日ですので、C" & x & "から貼り付けます。" With ActiveSheet .Range("C2:AD12").Copy .Range("C" & x).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone End With End Sub

専門家に質問してみよう