エクセルVBA(マクロ)で自動記録する方法

このQ&Aのポイント
  • エクセルVBA(マクロ)を使用して、自動記録する方法について教えてください。
  • エクセルマクロでの「絶対参照セル」の表現方法についても教えてください。
  • 実際のシートで入力した関数と同じようにVBAで記述する方法について教えてください。
回答を見る
  • ベストアンサー

エクセルVBA(マクロ)の書き方で・・・

VBA初心者です。よろしくお願いします。 エクセルマクロで、次のような関数を入力して、 =IF(月!$D4=稼動シート!$B$2,月!B4,"◆") 自動記録をさせると コードは、次のような「絶対参照セル」(←表現あっていますか?)の表示になります。 『Range("C4").Select ActiveCell.FormulaR1C1 = "=IF(月!RC4=稼動シート!R2C2,月!RC[-1],""◆"")"』 わたしのスキルでは、この記述コードを参考に別のコードを書こうにも理解と応用が効きません。 そこで、VBAコードにも 『Range("C4").Select  =IF(月!$D4=稼動シート!$B$2,月!B4,"◆")』 と単純に書いてはいけないのでしょうか?また、どうすれば実際のシートで入力した関数と同じような表現でVBAにもかけるのでしょうか? ご指導お願いいたします。

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

  • ベストアンサー
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.1

Range("C4").Formula = "=IF(月!$D4=稼動シート!$B$2,月!B4,""◆"")" そのままで1行で記載するならこうなります。 Selectは直接設定にすることで省略可 Formulaは式をセットする為省略不可 数式自体を""で囲むのも値でなく、式をセットするのに省略できません。 ◆の前後の""は文字列内にて"を意味する設定なので省略できません。

yastaro
質問者

お礼

ありがとうございました。 わかりにくい質問だったと思いますが、理解していただいた上での的確な質問に感謝いたします。

関連するQ&A

  • Excel VBA 計算範囲の変更について教えてください。

    こんばんは。とても困っています。 下記のような表で=A1&B1&C1の計算式を入れ、A1とB1を絶対参照にして$A$1&$B$1&C1としてD3までオートフィルをかけます。 そしてD4は =$A$4&$B$4&C4のように絶対参照しているセルを変更したいのです。たくさんありすぎて参照する範囲を変更するのにとても大変な思いをしています。VBAでどのようにすればよいのか教えてください。   |A    B   C     D ------------------------------------- 1| 1T  11L   A    1T11LA (=$A$1&$B$1&C1) 2|          B    1T11LB (=$A$1&$B$1&C2) 3|          C    1T11LC (=$A$1&$B$1&C3) 4| 2T  20L   A    2T20LA (=$A$4&$B$4&C4) 5|          B     2T20LB (=$A$4&$B$4&C5) 6|          C    2T20LC (=$A$4&$B$4&C6) 7| 3T  31M   A    3T31MA (=$A$7&$B$7&C7) 8|          B     3T31MB (=$A$7&$B$7&C8) マクロで記録させたらところ下記のようになりました。 Sub 4行置きに参照範囲を変更する() Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=RC[-3]&RC[-2]&RC[-1]" Range("D1").Select ActiveCell.FormulaR1C1 = "=R1C1&R1C2&RC[-1]" Range("D1").Select Selection.AutoFill Destination:=Range("D1:D3"), Type:=xlFillDefault Range("D1:D3").Select Range("D4").Select ActiveCell.FormulaR1C1 = "=R4C1&R4C2&RC[-1]" Range("D4").Select Selection.AutoFill Destination:=Range("D4:D6"), Type:=xlFillDefault Range("D4:D6").Select Range("D7").Select ActiveCell.FormulaR1C1 = "=R7C1&R7C2&RC[-1]" Range("D7").Select Selection.AutoFill Destination:=Range("D7:D9"), Type:=xlFillDefault Range("D7:D9").Select End Sub ◎初心者なのでVBAにたくさんコメントを入れていただくと助かります。 宜しくお願い致します。

  • ExcelのVBAで一部困っています。

    現在下記のようなプログラム(一部)を使っています。 数式をコピーしているのですが、これを左側のセルが空白になったらコピーをやめるか、数式記入をやめる方法に変えたいのですが、どなたか、ご教授ください。 後で余計にコピーしたセルを消す作業を低減したいと思っています。 宜しくお願いします。 Range("E1").Select ActiveCell.FormulaR1C1 = "専用コード" Range("E2").Select ActiveCell.FormulaR1C1 = _ "=IF(RC[-1]=""ホンテン "",""ラ001"",IF(RC[-1]=""エーテン "",""ラ005"",IF(RC[-1]=""ビーテン "",""ラ007"",IF(RC[-1]=""シーテン "",""ラ008"",IF(RC[-1]=""ディーテン "",""ラ009"",IF(RC[-1]=""イーテン "",""ラ015"",IF(RC[-1]=""エフテン "",""ラ011"",IF(RC[-1]=""ジーテン "",""ラ014"",""""))))))))" Range("E2").Select Selection.Copy Range("e3:e1500").Select

  • エクセル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

  • 【エクセル】 VBAでエラーが出てわかりません。。

    やりたいことは、関数をマクロでセルに記入してオートフィルで指定した行数まで伸ばしたいのです。 (すでに関数で作成したファイルがあるのですが、行数が多いため、とても重い。。^^;) まずマクロの記録で次のマクロを取得しました。 Sub Macro4() Range("C4").Select ActiveCell.Formula = "=SUM(A2:A10)" Range("C4").Select Selection.AutoFill Destination:=Range("C4:C12"), Type:=xlFillDefault Range("C4:C12").Select Range("D11").Select End Sub そして、 Sheet2に貼り付けて > ActiveCell.Formula = "=SUM(A2:A10)" の"=SUM(A2:A10)"部分をちょっと長い関数ですが、 "=IF(ISERROR(INDEX(Sheet1!$I$1:Sheet1!$I$400,SMALL($A$2:$A$400,ROW(A1)),1)),"",INDEX(Sheet1!$I$1:Sheet1!$I$400,SMALL($A$2:$A$400,ROW(A1)),1))" と書き換えてマクロを実行すると「アプリケーション定義またはオブジェクト定義エラーです。」 というエラーが出てしまうんですが、どこを直せばわからないです。。 おかしいところを教えてください、よろしくお願いします。 わかり図らい説明かと思いますが。。この件(1行目の文)について似たようなことを解説して いるサイトがありましたら、教えて欲しいです。

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。  動作環境は  OS:WINDOWS XP  エクセル2003  です。 今、Book1.xlsというエクセルファイルがあります。 このファイルの中に、【sheet1】,【sheet2】,【sheet3】の3つのシートが存在しています。 【sheet1】および【sheet2】には、A列=ユニーク番号、B列=データ1、C列=データ2・・・・n列=データnの値が約1500行(各行で、データの値は異なります。)入っています。 この【sheet1】と【sheet2】のデータの内容を照合して【sheet3】にその結果を反映(TRUEまたはFALSE)します。 仮に【sheet3】のあるセル(仮にD3)の値がTRUEとなったら、【sheet1】のセル(D3)の値を【sheet3】のセル(D3)に代入する。 逆に【sheet3】のあるセルの値がFALSEとなったら、そのセルはFLASEのままにする。プログラムは以下の様にしたのですが、全てを処理するまでに相当時間がかかっています。 VBAのプログラムは今回初めて書いたので、プログラムが悪いのか、プログラムの思想が悪いのかがわかりません。 どなたかご教授していただけませんか?多分、コードの書き方もキレイではないと思います(悲) Private Sub データ照合ボタン_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Long Dim area As Range Dim A As Variant Dim WrkRange As String '----シート(1)とシート(2)の各セルの値を比較---- With Sheets("sheet1") WrkRow = .Cells(Rows.Count, 3).End(xlUp).Row End With Sheets("sheet3").Select For i = 12 To WrkRow WrkRange = Range("C" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" WrkRange = Range("D" & i).Select ActiveCell.FormulaR1C1 = "=EXACT('sheet1'!RC,'sheet2'!RC)" '・           '・           '・ Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("C" & i).Select Selection.Copy Range("C" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("C" & i) = True Then Sheets("sheet1").Select Range("C" & i).Copy Sheets("sheet3").Select Range("C" & i).Select ActiveSheet.Paste Else: End If Next i A = i - 1 Sheets("sheet1").Select For i = 12 To A WrkRange = Range("D" & i).Select Selection.Copy Range("D" & i).PasteSpecial xlPasteValues Sheets("sheet3").Select If Range("D" & i) = True Then Sheets("sheet1").Select Range("D" & i).Copy Sheets("sheet3").Select Range("D" & i).Select ActiveSheet.Paste Else: End If Next i          '・          '・          '・    End Sub

  • エクセルVBAでボタンを作ったシートとVBAを実行するシートを変えたい

    シート1にボタンを作成し、 そのボタンを押すと実行するVBAを作成しました。 そこで、VBAを実行するシートの指定はできるのでしょうか。 例えば、ボタンを押すと、 10行から20行まではシート2で実行させ、 30行から40行まではシート3で実行させたいと考えています。 可能でしょうか。 どうぞ宜しくお願いします。 *********************************************** 作成したVBA。ボタンはシート1にあります。 *********************************************** Private Sub CommandButton1_Click() *********************************************** ここからはシート2で実行させたい *********************************************** Range("E2").Select ActiveCell.FormulaR1C1 = "10" Range("E2").Select Selection.AutoFill Destination:=Range("E2:E101"), Type:=xlFillDefault Range("E2:E101").Select *********************************************** ここからはシート3で実行させたい *********************************************** Range("A2").Select ActiveCell.FormulaR1C1 = "100" Range("A2").Select Selection.AutoFill Destination:=Range("E2:E101"), Type:=xlFillDefault Range("A2:A101").Select End Sub

  • 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入力

    シート1  A    B   C     1 コード コード 金額     2 01 シート2  A    B   C   D   E     1 コード 名前 コード 名前 金額     2 01    あ  02   い  20     3 01    あ  03   う  30 シート1とシート2があります。シート1のA2に入力されたコードがシート2のA列に入力されていたら、その行のC列のコードをシート1のB2に反映し、E列の金額をシート1のC2に反映する。シート1のA2のコードは、シート2のA列に複数あるため、この作業を繰り返す。 シート1 A  B   C  1 コード コード 金額   2 01   02   20  3 01   03   30とできるようにするにはどうすればいいでしょうか?分かりにくい文章で申し訳ありません。関数では無理なのでVBAの入力しかないかと考えていますが、VBAは全くの初心者で困っています。どなたかご回答宜しくお願いいたします。   

  • excel VBAの検索マクロを、OOo CALCで動かしたいのですが

    excel VBAの検索マクロを、OOo CALCで動かしたいのですが、、、 お助けください。VBA素人で、OOo BASICは全くわからない者です。よろしくおねがいします。 シート1を検索データの入力及び検索結果の表示画面として使い、 シート2に検索先のデータが入力されています。 検索先のデータは乱雑に入力されており、探したいデータが複数の列に点在し、 かつ、ひとつのセルにふたつのデータが入っていることもあります。 部分一致検索で、EXCELの検索機能の「次を検索」ボタンと同じ機能を果たすように作ったつもりです。 データが見つかった場合、シート2のデータをシート1にコピーするようになっています。 ソフトウェアのバージョンはcalc2.0と3.0です。 Excelでは動いているのですが、どう変えればcalcで使えるようになりますでしょうか? --------------------------------------------- Sub kensaku() 'sheet1のC4に検索したいデータを入力済 Dim A Set A = Range("sheet1!C4") Dim B As Range 'シート2を選択。 Sheets("sheet2").Select 'A1:S800の範囲をAの値で検索。 Set B = Range("A1:S800").Find(What:=A, _ after:=ActiveCell, SearchDirection:=xlNext, _ LookAt:=xlPart, MatchCase:=False, _ MatchByte:=False, SearchFormat:=False) '分岐 '見つからなかった場合、シート1の関数参照先のセルをクリアしてリセット。 If B Is Nothing Then MsgBox "見つかりません" Sheets("sheet1").Select Range("C2").ClearContents '見つかった場合、処理を続行する。 Else B.Activate 'A列へ移動。場合により空白セルを超える必要があるため10回繰り返す。 Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select Selection.End(xlToLeft).Select 'A列からC列へ移動すると目的のデータが入った列に到達。 Selection.Offset(0, 2).Select 'その値をコピーしてシート1のC2へ貼付(関数の参照先) Selection.Copy Sheets("sheet1").Select Range("C2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False '範囲選択を解除 Application.CutCopyMode = False 'sheet2のアクティブセルを次の検索開始位置(16列右)へ移動 (条件に一致する次のデータを検索するため) Sheets("sheet2").Select Selection.Offset(0, 16).Select 'シート1に戻る Sheets("sheet1").Select End If End Sub

  • VBAについて

    いつもお世話になっています マクロ・VBA超初心者です。 質問させてください。 現在シート1の完売のセルの欄に○が入っていれば日付をみてシート2の同じ日付の隣のセルに○を入力しようと思っているのですが、シート2の日付を検索はしているんですが入力がいきません Sheet1  ↓セルA1 ↓セルB1  5月26日   26           B1のセルはDAY(A1)にて出してます         完売  A氏     ○             Sheet2  ↓A列   ↓B列 5月  1日  ・  ・  ・  26日    ○           ←シート1の所に○が付いているとシート1セルB1と同じ  27日                  日付の隣のセルに○を入力  28日 VBA Sub test() Sheets("Sheet2").Select Range("A1").Select Do Until ActiveCell = "" ActiveCell.Offset(1, 0).Activate If ActiveCell.Value = Worksheets("Sheet1").Range("B2") Then ActiveCell.Offset(0, 1).Activate If ActiveCell.Value <> "○" Then ActiveCell.Valu = "○" ActiveCell.Offset(0, -1).Activate Else ActiveCell.Offset(0, -1).Activate End If Else End If Loop Sheets("Sheet2").Select Range("A1").Select End Sub どこが間違っているかわからない状態です。 分かりにくい説明ではあるんですが教えてください お願いします。

専門家に質問してみよう