• ベストアンサー

マクロ 関数の設置 「'」クオーテーションマークが勝手に入ってしまう

http://oshiete1.goo.ne.jp/qa2917251.html で問題解決していただいた者です。たびたび初心者的質問、失礼いたします。 以下のマクロを実行して、 =SUMIF(シート2!$B$1:$B$200,"*"&B4&"*",シート2!$C$1:$C$200) という関数を設置しようとしています。 ----- ActiveCell.SpecialCells(xlLastCell).Select データ下 = Range("シート2!B1").End(xlDown).Row 数値下 = Range("シート2!C1").End(xlDown).Row データ = 2 数値 = 3 選択範囲1 = "R1" & "C" & データ & ":R" & データ下 & "C" & データ 選択範囲2 = "R1" & "C" & 数値 & ":R" & 数値下 & "C" & 数値 数式 = "=SUMIF(シート2!" & 選択範囲1 & ",""*""&B4&""*"",シート2!" & 選択範囲2 & ")" Range("A1").Formula = 数式 ----- ところが、実際に上記を動かしますと、 =SUMIF(シート2!$B$1:$B$200,"*"&'B4'&"*",シート2!$C$1:$C$200) 真ん中あたりの検索条件、「B4」の両となりに「'(シングルクオーテーション)」が勝手に付加されてしまいます。 初歩的なことで大変恐縮ですが、これの原因と対策をご教示いただけないでしょうか? どうかよろしくお願いいたします。

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

因みに、 選択範囲1 = "R1" & "C" & データ & ":R" & データ下 & "C" & データ 選択範囲2 = "R1" & "C" & 数値 & ":R" & 数値下 & "C" & 数値 はそのままで、 数式 = "=SUMIF(シート2!" & 選択範囲1 & ",""*""&B4&""*"",シート2!" & 選択範囲2 & ")" だけを直すなら、 数式 = "=SUMIF(シート2!" & 選択範囲1 & ",""*""&R[3]C[1]&""*"",シート2!" & 選択範囲2 & ")" にします。 "R[3]C[1]"は、結果を"B4"のように相対参照にする為で、数式を入れるA1セルからの相対位置で「A1から3行下の1カラム右」を指定しています。 No,1の回答のように絶対参照で"R4C2"とやってしまうと、結果の数式が絶対参照の"$B$4"になってしまいます。 行数、数値扱いのカラム位置から、セル参照文字列を作る場合、Address()を使うのが本筋です。

touyou
質問者

お礼

お礼が遅くなりまして、申し訳ありません。 ていねいな修正例までありがとうございました! No.2のご回答の方では、私の知識範囲では理解できませんでしたが、 こちらのサンプルはわかりやすくすぐ反映することができました。 Address() の件は使いこなせるよう調べておきます。 大変助かりました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 現実的には、このような数式を作るマクロよりも、直接、マクロで作ったほうが早いだろうとは思います。いずれにしても、もう少し、プログラムらしく、すっきりと書いたほうがよいかと思います。 Sub TestSample() Dim sh1 As Worksheet Dim sh2 As Worksheet Dim rng1 As Range Dim rng2 As Range Set sh1 = Worksheets("シート1") Set sh2 = Worksheets("シート2")  With sh2   Set rng1 = .Range("B1", .Range("B65536").End(xlUp))   Set rng2 = rng1.Offset(, 1)  End With  sh1.Range("A1").FormulaLocal = _  "=SUMIF(" & sh2.Name & "!" & rng1.Address & ",""*"" & B4 &""*""," & sh2.Name & "!" & rng2.Address & ")" Set rng1 = Nothing Set rng2 = Nothing Set sh1 = Nothing Set sh2 = Nothing End Sub R1C1 方式なら、こんな感じかな?A1方式と混在なのは、いかにもおかしいけれども。「'」が入るのは、R1C1方式と混在しているからでしょうね。 sh1.Range("A1").FormulaLocal = _   "=SUMIF(" & sh2.Name & "!" & rng1.Address(1, 1, xlR1C1) & ",""*""&" & Range("B4").Address(0, 0, xlR1C1) & "&""*""," & sh2.Name & "!" & rng2.Address(1, 1, xlR1C1) & ")"

touyou
質問者

お礼

お礼遅くなってしまい申し訳ありません。 サンプルをいただきありがとうございました。 こちら実行してみましたところ、うまくいきました! ・・しかし、使いこなせる範囲外の例なので、応用がききません。。 (色々探していた際、似たようなサンプルを見たことがあったので、こちらのように書けばより適しているのだとは思います) 保存させていただき、内容調べて使えるようにしてみます! ありがとうございました!

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

選択範囲1 = "R1" & "C" & データ & ":R" & データ下 & "C" & データ 選択範囲2 = "R1" & "C" & 数値 & ":R" & 数値下 & "C" & 数値 数式 = "=SUMIF(シート2!" & 選択範囲1 & ",""*""&B4&""*"",シート2!" & 選択範囲2 & ")" を 選択範囲1 = "シート2!" & Worksheets("シート2").Cells(1, データ).Address() & ":" & Worksheets("シート2").Cells(データ下, データ).Address() 選択範囲2 = "シート2!" & Worksheets("シート2").Cells(1, 数値).Address() & ":" & Worksheets("シート2").Cells(数値下, 数値).Address() 数式 = "=SUMIF(" & 選択範囲1 & ",""*"" & B4 & ""*""," & 選択範囲2 & ")" に修正。

touyou
質問者

お礼

お返事遅くなりまして申し訳ございません。 こちら、ためしてみましたところうまくいったのですが、 このマクロを作成したあと、B列の下のセルにずらりとこれを 複写していくマクロをこのあとに実行する予定で、 絶対参照だと具合がわるいのです。。。 本当にありがとうございました!

touyou
質問者

補足

申し訳ありません、お礼の投稿場所をまちがえました。 No.1の方へのお礼文でした。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

> 選択範囲2 = "R1" & "C" & 数値 & ":R" & 数値下 & "C" & 数値 こちらは、「R1C1形式」でセルを指定しているのに、 > 数式 = "=SUMIF(シート2!" & 選択範囲1 & ",""*""&B4&""*"",シート2!" & 選択範囲2 & ")" こちらは、「A1形式」でセルを指定と、統一されていないからでは? > 数式 = "=SUMIF(シート2!" & 選択範囲1 & ",""*""&R4C2&""*"",シート2!" & 選択範囲2 & ")" とか・・・

touyou
質問者

お礼

お返事遅くなりまして申し訳ございません。 こちら、ためしてみましたところうまくいったのですが、 このマクロを作成したあと、B列の下のセルにずらりとこれを 複写していくマクロをこのあとに実行する予定で、 絶対参照だと具合がわるいのです。。。 本当にありがとうございました!

関連するQ&A

  • 関数の中で参照するセル範囲(変動する)の記述方法

    セルJ5に下記の数式を入力するマクロを組みたいのですが、記述方法が分かりません。   =SUMIF(セル範囲(1),B5,セル範囲(2))  ・セル範囲(1)にはB5:C列の最終データまで  ・セル範囲(2)にはC5:C列の最終データまで 自分なりに   ActiveCell.Formula = "=SUMIF(Range(Cells(5, 2), Cells(Range("b5").End(xlDown).Row, 3)),b5,Range(Cells(5, 2), Cells(Range("C5").End(xlDown).Row, 3)))" と書いてみたのですがダメでした。 どうかご教授お願い致します。

  • エクセルのマクロで番号を入力する

    エクセルのマクロに取り組んでいます。 まだ初心者なのでわからないことが多いです。 エクセルのバージョンは2010です。 「入力シート」にボタンを作って、ボタンを押すと「1」と入力できる。 ほかの項目を入力し、保存し、「1」を消して、またボタンを押すと 「2」と入力になる。 このように、ボタンを押すと「1」「2」「3」…と入力できるようにしたいのですが、 どのようにマクロを組んだらよいでしょうか? また、自分で以下のように組んで見たところ、「1048576」となってしまい、「1」になりませんでした。 どこを直せばいいのでしょうか? Sub Macro4() ' ' Macro4 Macro ' 受付番号確認&入力 ' Worksheets("入力").Activate '入力シートをアクティブ MsgBox "次の受付番号→ " & Worksheets("データ").Range("A2").End(xlDown).Row Range("B2") = Worksheets("データ").Range("A2").End(xlDown).Row End Sub ご回答よろしくお願いします。

  • vbaの速度向上(sumif関数)

    エクセルvbaの速度を向上できないか、お知恵を貸していただきたく存じます。 以下のvba(sumif関数)をもっと速めたいです。何とかできないでしょうか。長い記載となり申し訳ないのですが、何卒よろしくお願い申し上げます。 myCnt7 = 2 Do Worksheets("●").Cells(myCnt7, 4).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 3), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 3), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 7).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 6), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 6), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 10).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 9), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 9), Worksheets("★").Range("C:C")) Loop While myCnt7 > 201 ※シート●のC列から3列ごとに、Sumifの検索条件があります。 ※シート●のD列から4列ごとに、Sumifの計算結果を出力させます。 ※計算対象シートは、シート◆とシート★の2つです。  シート◆のSumif合計から、シート★のSumif合計を差し引いています。  Sumifの条件自体は、どちらのシートも同じ(シート●)。 ※上記のSumif関数の記述は、3つですが、実際の記述は24あります。 ※すなわち、検索条件の組み合わせが24あり、201行分をmyCnt7でLoopさせて実行しています。

  • VBAマクロエラー【オーバーフローしました。】

    以下のVBAマクロで突然エラーが出るようになってしまいました。 原因がわからず困っています。 どなたかご教授ください。 該当部分 :S = Range("B2").End(xlDown).Row エラーMrg:実行時エラー'6': オーバーフローしました ----------マクロ文---------- Sub 部担コード読み替え() Dim R_Count As Integer Dim P_Sheet As String Dim S As Integer 'データ取込用のファイルを開く Workbooks(D_Book).Activate Sheets("Data1").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select Sheets("Data2").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Columns("G:G").Select Selection.Insert Shift:=xlToRight Range("G2:G" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("G1").Value = "キー" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Columns("E:E").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select End Sub

  • VBA マクロ シート 転記

    はじめまして。VBA初心者です。今シート1のA列1行目セルにA社、A列2行目にB社、A列3行目にC社と・・ざっと1000行程あり、それぞれB列には値があります。この値をシート2のB列に転記したいと思っています。ただ、毎月シートを追加していきますので、左隣のシートから転記しなければなりません。シート2の項目は同じA列とB列で構成されています。A列の値が多少前後するので、FINDを使って以下のようなプログラムを作りました。ただ、左隣のシートから転記とう内容をどうやって追加したら良いのかがわかりません。Previous をどこかに使えばできるのかなとも思うのですが、その方法がわかりません。 Sub 転記() Dim ws As Worksheet, ws1 As Worksheet, r As Range, r1 As Range Dim LastRow As Long, i As Long, er As Long, wkey As String Set ws = Worksheets("Sheet1") Set ws1 = Worksheets("Sheet2") LastRow = ws.Range("A1").End(xlDown).Row er = ws1.Range("A1").End(xlDown).Row Set r = ws.Range("A1:A" & LastRow) For i = 1 To er wkey = ws1.Range("A" & i) Set r1 = r.Find(What:=wkey, LookIn:=xlValues, LookAt:=xlWhole) If Not r1 Is Nothing Then ws1.Range("B" & i) = r1.Offset(, 1) End If Next Set r1 = Nothing Set r = Nothing Set ws = Nothing Set ws1 = Nothing End Sub どなたか詳しいお方いらっしゃいましたら、初心者の私に教えて頂けませんでしょうか?宜しくお願いします。

  • エクセルのマクロ Range("A1").End(xlDown).rowで列を削除

    A列の一番下のデータの次の行から F列の一番下のデータの行まで削除したいのですが Rows(" & Range("A1").End(xlDown).row+1 & ":" & Range("F1").End(xlDown).Row & ").Delete Shift:=xlUp でうまくいきません どうすればいいのですか?

  • 表内の斜め左半分を選択するマクロコードがわかりません?

    Windows XP Home Edition Excel 2002 表内の緑色の斜め左下半分(緑色)だけをB8の右へ順次貼り付けたいのですが、うまく動作してくれません。 番号行(グレー色)は、各シートによって違ってきます。 各シートの表は、必ず、当表のように対角線状だけ空白セルになっております。 ほんとは、表内の緑色のデータだけを選択さえできればいいのですが、自分の能力では、  当質問内容の方法しか考えつきませんでした。 何卒、ご教授お願い致します。 Sub 斜め左半分を選択() Dim r As Range  With ActiveSheet  For Each r In .Range("A4", .Range("A4").End(xlDown))   Range(r.Offset(0, 1), .r.End(xlToRight)).Copy _   Destination:=r.End(xlDown).Offset(1, 1).End(xlToRight).Offset(0, 1)  Next r  End With End Sub

  • 【Excel VBA】データの最終行について

    Excel2003を使用しています。 ある一覧表形式のデータSheet1をSheet2に値のみコピーして、このSheet2を“印刷用”として、ページ設定等をして、印刷のみに使用しようと思っています。 Sheet2のI列、J列、K列には数値が入力されていて、I列、J列、K列のデータの最終行の1行下に、それぞれ6行目からデータ最終行までの合計の数式が入力されるよう、コードを追加したのですが、数式は入力されるものの、入力したい行に数式が入力されません。 マクロを実行して、数式が入力された行を見てみると、301行目に入力されていました。 Sheet1は別のシートのデータを数式により表示していて、数式が300行まで入力されているので、Sheet2の元になっているSheet1の影響(?)なのかな~?と…。こういう場合、どうすればいいでしょうか? コードは下記のようになっています。 よろしくお願いします。 ---------------------------------------- Sub 印刷用作成() Dim i As Integer Dim j As Long Sheets("Sheet1").Activate Range("B6:L6", Range("L6").End(xlDown)).Select Selection.Copy Sheets("Sheet2").Select Range("B6").PasteSpecial xlPasteValues Application.CutCopyMode = False For i = 9 To 11 j = Application.Max(j, Cells(65536, i).End(xlUp).Row + 1) Next For i = 9 To 11 Cells(j, i).FormulaR1C1 = "=SUM(R2C[0]:R[-1]C[0])" Next i End Sub

  • マクロでシート2~6のデータをシート1に転記したい

    マクロでシート2~6のデータをシート1に転記したいです。 シート2~6のデータを シート1に順番に転記したくてマクロの記録を利用して作成しました。 シート2~6は列は同じですが行数は異なります。 また行数は作業の都度異なります。 同じ記述が繰り返されているので もう少し記述が短くできるのではと思うのですが どうすればいいでしょうか? Sub データ更新() 'シート1の前回データをクリア Sheets("シート1").Select Range("A2:Q2").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents Range("A2").Select Sheets("シート1").Select Range("A1").Select Sheets("シート2").Select Range("A1").Select 'ヘッダーも合わせて取得 Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート3").Select Range("A2").Select 'データのみ取得 Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート4").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート5").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート6").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select End Sub

  • Match関数がうまく機能していない??

    すみません。また教えて下さい。 過去ログを見てシート1にあったデータをシート4にあるデータと照らし合わせてすでにあれば書き換え、なければ追加というようにできるようにしたく過去ログを参考にしてやったのですが、どうしてもエラーが出てしまいます。 Private Sub aa() Dim intlastrow1 As Integer Dim strb As String Dim longlastrow1 As Long intlastrow1 = Sheets(1).Range("A7").End(xlDown).Row longlastrow1 = Sheets(4).Range("A1").End(xlDown).Row Dim c As Object Dim rtn As Variant Dim d As Integer With Sheets(4) .Select For Each c In .Range("A1", "A" & longlastrow1) rtn = Application.Match(c.Value, Sheets(1).Range("A7:A" & intlastrow1), 0) d = c.Row strb = Cells(d, "A").Value If IsError(rtn) Then With Sheets(4).Cells(longlastrow1 + 1, "A") .Value = strb With .Font .Name = "MS Pゴシック" .Bold = False .Size = 8 End With End With Sheets(4).Cells(longlastrow1 + 1, "B").Value = Sheets(1).Range("A2").Value Sheets(4).Cells(longlastrow1 + 1, "F").Value = ShowFormula(Sheet1.Range(Cells(d, "J"), Cells(d, "N"))) longlastrow1 = longlastrow1 + 1 End If If Not IsError(rtn) Then Exit Sub End If Next c End With End Sub 以上のように組んだのですがうまくいきません。 具体的に言うとシート1のA7よりしたに名前が並んでいる(山田、鈴木・・・)とお考え下さい(シート4のA2以下にも同様に名前が並んでいる)。字数の関係で判定後の処理が不十分になっています。