• ベストアンサー

マクロ:エクセルVBAでのワークシート関数の参照について

VBA内でワークシート関数を使用する際の、引数の参照について困っています。 満たしたい条件は、 (1)マクロ実行後のシート上においても、セル選択状態で数式「=B1*sum(A1:A3)」 といったように、「値」ではなく、「数式」が入力されているようにしたい。 ↑ Application.WorksheetFunction.Sum(・・・は使えない? (2)上記例のB1およびA1:A3については、マクロ内のユーザ入力によって位置が変わり、C1にもD1にもなり得るので、 cells(1,1)="=B1*sum(A1:A3)" といった「B1」[A1:A3]的な参照を使いたくない。 イメージとしては、 sub sample() number = inputbox("数字を入力してください") cell_a = inputbox("セル1") cell_b = inputbox("セル2") yourrange = range(cells(cell_a,1),cells(cell_b,1) cells(1,1)="=number*sum(yourrange)"・・・※ end sub みたいなことをしたいのですが、※のようなことを する方法はありますでしょうか? 説明が下手なもので、補足等あれば随時いたします。 使用環境はWindows2000、Office2000です。 よろしくお願いします。

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

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

こんばんは。 その種類のマクロは、練習用のみだと思います。実務レベルにはあまり良くないサンプルだと思います。 ダイアログ型は、よほど、複雑なものでない限りは、これレベルでは、回数は1回ぐらいにします。 なお、Application.Input( ,Type:=8) は、Range型ですから、範囲を選択できます。ただし、以下のコードは変更しなければなりません。 Sub TestSample()  Dim Numver As Variant  Dim cell_a As Range  Dim cell_b As Range  Dim myRange As Range  Dim msg As String  On Error GoTo EndLine  Number = Application.InputBox("数字を入力してください", Type:=2)    '数字以外の入力のエラー処理  If IsNumeric(Number) = False Then    MsgBox "その入力は出来ません。"    Exit Sub  ElseIf Number = "False" Then    Exit Sub  End If    msg = vbCrLf & "をクリックしてください。"  Set cell_a = Application.InputBox("セル1" & msg, Type:=8)  Set cell_b = Application.InputBox("セル2" & msg, Type:=8)    '循環参照のエラー処理  If Not Intersect(Cells(1, 1), Range(cell_a, cell_b)) Is Nothing Then    MsgBox "その範囲選択は出来ません。"    Exit Sub  End If    Set myRange = Range(cell_a.Cells(1), cell_b.Cells(1))    Cells(1, 1).FormulaLocal = "=" & Number & "*SUM(" & myRange.Address(0, 0) & ")" EndLine: End Sub Address(0, 0) は、相対参照。絶対参照は、(0,0) を取り、myRange.Address とします。 FormulaLocal は、Excel Nativeモードで入力値を与える場合は、Formulaのみでも、.Valueプロパティでも良いのです。PCのコントロールパネル側の地域に関わる部分がある時、FormulaLocal プロパティが必要になります。

garagerand
質問者

補足

早速のご回答ありがとうございました!! お忙しい中恐れ入ります。 だいたいわかってきたのですが、もしご存知でしたら、 1つのセルをワークシート関数の中で、絶対参照、相対参照する方法を教えていただければと思います。 上記例の中で「Number」が「値」ではなく、 あるセルの数値を参照したいとき、のやり方です。

その他の回答 (2)

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

こんばんは。Wendy02です。 >1つのセルをワークシート関数の中で、絶対参照、相対参照する方法を教えていただければと思います。 少し、文章があいまいなのですが、ワークシート上のセルの数式を絶対参照、相対参照する方法と読み替えます。 Sub testFormula()  MsgBox AbsRel(ActiveCell) End Sub 'ユーザー定義関数を作りましたので、試してみてください。 Function AbsRel(mRange As Range) Dim mStyle As Integer Const ABSO As Integer = xlAbsolute Const RELAT As Integer = xlRelative   If mRange.HasFormula And Not mRange.HasArray Then   If InStr(mRange.FormulaLocal, "$") > 0 Then     mStyle = RELAT '相対   Else     mStyle = ABSO '絶対   End If      AbsRel = Application.ConvertFormula( _      Formula:=mRange.FormulaLocal, _      fromReferenceStyle:=xlA1, _      toReferenceStyle:=xlA1, _      toabsolute:=mStyle)    End If End Function >「Number」が「値」ではなく、 >あるセルの数値を参照したいとき、のやり方です。 セルの数値とInputBox で入れる Number とは、変数では、共有できません。仮に、Variant 型にしても、Set で、数値を格納するときにエラーが出てしまいます。 Set cell_a = Application.InputBox("セル0", Type:=8) Number =cell_a.Value という形ぐらいだと思います。

garagerand
質問者

お礼

ご回答ありがとうございます。 ご丁寧な説明をしていただいたおかげで、 解決することができました。 まだまだわからないことだらけですが、 またよろしくお願いします。

  • masa_019
  • ベストアンサー率61% (121/197)
回答No.1

こんばんは。 多分こんなことがしたいのかなと思いますが Sub sample1() Dim Number Dim cell_a As Long Dim cell_b As Long Dim yourrange As String Number = InputBox("数字を入力してください") cell_a = InputBox("セル1") cell_b = InputBox("セル2") yourrange = Range(Cells(cell_a, 1), Cells(cell_b, 1)).Address Cells(1, 1).Formula = "=" & Number & "*sum(" & yourrange & ")" End Sub いかかでしょう?

garagerand
質問者

補足

早速のご回答ありがとうございました!! お忙しい中恐れ入ります。 だいたいわかってきたのですが、もしご存知でしたら、 1つのセルをワークシート関数の中で、絶対参照、相対参照する方法を教えていただければと思います。 上記例の中で「Number」が「値」ではなく、 あるセルの数値を参照したいとき、のやり方です。

関連するQ&A

  • VBA ワークシート関数のエラー

    シートに数式を入れていたものを、VBAで値のみ入力しようと考えています。 そこで、.Cells(1,1) = WorksheetFunction.数式といった形のメソッドを試しています。 しかし、複雑な数式を記述するとエラーが出てしまいます。 成功 (iferrorというワークシート関数が1つ) Debug.Print WorksheetFunction.IfError(1 / .Cells(1, 5) + 1 / .Cells(1, 6) + 1 / .Cells(1, 7) - 1, "P") 失敗(ワークシート関数のifとcountifなど複数のものが数式に混入) Debug.Print WorksheetFunction.If(CountIf(Range("C17:D49"), Range("C29")) > 5, Range("C29"), Range("D29")) Countifの場所でエラーになります。このcountifを使えるようにするためには、どうすればよいのでしょうか? WorksheetFunction.if(WorksheetFunction.Countif(、、、、という書き方はダメでした。 数式が汚くてすみません。 宜しくお願いいたします。

  • エクセルVBAとワークシート関数が違う答え?

    エクセル2013です。 A1セルからA100セルにすべて1%と入力されています。 BIセルに =SUM(A:A) と数式が入っており、100%と表示されています。 A,B列のセルの書式はすべてパーセテージです。 101行以下には何も入っていません。 C1セルに =B1=1 と数式が入っており、TRUEが表示されています。 標準モジュールに Sub test01() MsgBox Range("B1").Value = 1 End Sub と書きました。 実行したところFalseが帰ってきました。 なぜ、TRUEにならないのでしょうか? なお、 Sub test02() MsgBox Val(Range("B1").Value) = 1 End Sub とすると、TRUEが帰ります。 でも、Val関数はStringを数値化するものですよね? B1セルはもともと数値なのでVal関数で答えが変わるのも不思議です。 どなたか、わかるように教えていただけないでしょうか?

  • EXCEL 一覧シートから各シートへ参照

    現在シートが 一覧、1、2、3、 とあります。 一覧シートには、 シート名(A1) 名前(B1) 1(A2) 山田(B2) 2(A3) 鈴木(B3) 3(A4) 木村(B4) と記載されております。(カッコ内は、セルの位置です) シート 1 のA1には、山田 シート1のB2を参照 シート 2 のA1には、鈴木 シート1のB3を参照 シート 3 のA1には、木村 シート1のB4を参照 とシート 一覧から参照して表示されるようにしたい と考えております。 数字の名前のシートが数個であればシート毎に入力すれば済む話ですが、 予定では、順次増え、最終的には100位になる予定です。 数式、マクロ VBA 等を使って  一覧シートに名前を入力すると該当のシートのA1セルに参照させる事は可能でしょうか? よろしくお願いいたします

  • エクセル VBA ワークシート関数をマクロで使う?

    エクセル VBA ワークシート関数をマクロで使う? まず、人名・月ごとの、その日にどの注番の仕事を何時間したかという表があります。 シート名は 年.月氏名 で セルF4~F63に注番、R4~R63に作業時間です。 次に、注番ごとにかかった作業時間や経費を求める表を別シートに作りました。 B4~AY4 に注番、A8~A20に氏名 B8~AY20に 注番、氏名ごとの3ヶ月(今月から先先月)の作業合計時間をマクロで作りたいのです。 最初は、A8~A20にシート名を入力し、セルB8の例ですが、計算式 =IF($A$8="","",IF(B4="","",SUMIF(INDIRECT($A$8&"!$F$4:$F$63"),B4,INDIRECT($A$8&"!$R$4:$R$63")))) としていたのですが、メモリ不足などの問題もあり、上記のようにマクロで作成したいと思いますが、初心者なので、構文が浮かびません。 Sub 作業時間計算() ' Dim シート名 As String Dim 氏名 As String Dim i As Integer Dim j As Integer シート名 = Year(Date) & "." & Month(Date) & 氏名 氏名 = ActiveSheet.Range("A", i).Value For i = 8 To 20 For j = 2 To 51 Cells(8, j).Value = Next j Next i End Sub また、3ヶ月分を合算するのは、シート名の Month(Date) を -1、-2 とすればよいのかと思うのですが、今月が、1月や2月のとき、Year(Date) も -1 しなくてはなりません。 併せて教えてください。 よろしくお願いします。

  • VBA 他シートを参照しているセルのコピー

    お世話になります。 以下のシートがあります。 [sheet a]    A     B        C      D     E 1 2004 2005 2006 2007 2008 2 =b!A2 =b!C2 =b!E2 =b!G2 =b!I2 3 10 15 16 4 11 4 12 30 20 9 2 5 =SUM(A3:A4) =SUM(B3:B4) =SUM(C3:C4) =SUM(D3:D4) =SUM(E3:E4) [sheet b] A B C D E  F G H I J 2004 2005 2006 2007 2008 1 あ1 い1 う1 え1 お1 か1 き1 く1 け1 こ1 2 あ2 い2 う2 え2 お2 か2 き2 く2 け2 こ2 ・・・・・・・・・ [sheet a]F列以降に入れるデータは、VBA(マクロ)を使って、別のブックから取り出しています。 (例) F1…=E1+1(E1の数式をコピー) F3,F4…任意の値(別のブックからコピー) F5…=SUM(F3:F4)(E5の数式をコピー) 1行目,5行目の場合は左のセルをコピーして数式を貼り付けると、列が自動的に列が変わりますが、2行目の場合は元のシートを1行おきに参照しているので、単純にコピーしただけでは正しい数式が入りません。 2行目の参照をVBAで作るには、どのようにしたらいいでしょうか。 よろしくお願いします。

  • エクセル2000のマクロにおける、複数シート間のコピー&ペーストについて

    閲覧ありがとうございます。 現在、エクセル2000(OS、WIN2KPRO)を用いて、以下のような仕様のマクロを組もうとしています。 1.Sheet1のCommandButton1から実行する。 2.Sheet2のA1セルから、O?セルまでのデータの入っているセルをコピーし、Sheet1のB4セル以下にペーストする。 3.O?セルの?は1000以下の値で変化する。 4.Sheet2のF列には、ユニークキーが入力される為、必ず値が入力されている。 上記の仕様に従い、以下のようなマクロを組みましたが、 > Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select のラインでエラーが発生します。 激しく独学の為、汚いソースですみません^^; **************************************** Private Sub CommandButton1_Click() Worksheets("Sheet2").Select Worksheets("Sheet2").Activate Dim Line_Num Line_Num = 1000 - WorksheetFunction.CountBlank(Range("F1:F1000")) Worksheets("Sheet2").Range("A1").Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Select Worksheets("Sheet2").Range(Cells(1, 1), Cells(Line_Num, 15)).Copy Worksheets("Sheet1").Select Worksheets("Sheet1").Activate Range("B4").Select ActiveSheet.Paste End Sub

  • エクセル2010の絶対参照について。

    エクセル2010についての質問です。 ファイルはエクセル2003?2007?のものを互換モードで使っております。 よろしくお願い致します。 sheet1のセルA1に、別のシート(Sheet2)のA2~A11の合計をオートサムで求めると数式が=SUM([Sheet2.xls]Sheet2!$A$2:$A$11)となっています。 sheet1のセルB1に数式=SUM([Sheet2.xls]Sheet2!$B$2:$B$11) sheet1のセルC1に数式=SUM([Sheet2.xls]Sheet2!$C$2:$C$11) sheet1のセルD1に数式=SUM([Sheet2.xls]Sheet2!$D$2:$D$11) をオートフィルか、コピーアンドペイストで素早くやりたいのですが、 数式の$を消して、=SUM([Sheet2.xls]Sheet2!A2:A11)でオートフィルでできるのですが、 自動で$が入力されるのがなぜだか分かりません。 $が自動で入力される理由と、$があるなしの違いを、理解してる方に聞きたいと思い 質問しました。 よろしくお願い致します。

  • エクセルのマクロについて

    QNo.3421130で質問させて頂いた件の続きなのですが 入力シート(1)のA1に入力された値を、シート2のB1に表示(つまりB列の同じ行数のセルに表示)するというマクロをお教え頂き、早速実践してみましたが、入力シートA1に入っている値が入力シートA10から算出された値(例:A11に日付の2007/10/18と入っていて、A10にはMONTH関数で10だけを抽出している。そのA10の値10をA1が参照している状態やIF関数で反映された値等)がシート2に表示されません。 また本マクロは入力シート(1)とシート2の同じ行列のセルの表示しか出来ませんが、たとえば入力シート(1)のA2セルの値をシート2のB4に表示(任意で表示位置を変更する方法、シート2の反映セルを下へずらす等)が分りません。 以下、お教え頂いたマクロです。 Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Column = 1 Then    Sheets("Sheet2").Cells(Target.Row, "B").Value = Target.Value  End If End Sub 続きの質問であることと、説明が分りにくく大変申し訳ありません。 非常に困っております。よろしくお願いします。

  • エクセルVBAでワークシート関数のようにしたい

     例えば、セルA1に日付を入力して、セルB1に関数WEEKDAYが入力されていると、すぐセルA1の値を返してくれますが、これと同じことをVBAで再現したいのですが、可能でしょうか?  マクロやVBAでWEEKDAYを記述しても、「ツール」→「マクロ」→「マクロ」か「VBA」でやらないとA1の値をB1に返せないので、A1に日付を入力した瞬間、B1に値を返したいのですが、よろしくお願いします。

  • ExcelのマクロによるVLOOKUPの参照シートの変更について

    ExcelのマクロによるVLOOKUPの参照シートの変更について ブックAのSheet1のセルA1にドロップダウンリストを作成し、アルファベットの"J"、"M"、"A"が選択できるようにしてあります。 ブックAのSheet2のセルB1には、以下の式が入力してあり、別のブック(ブックB)から情報を読み込んでいます。 =VLOOKUP(A1,'¥¥s_g¥欠席¥[ブックB.xls]国語'!$B$4:$V$30,4,FALSE) やりたい事は↓ ブックAのSheet1のセルA1にある、ドロップダウンリストを変更すると、ブックAのSheet2のセルB1にある式(上記式)の参照シート(上記式では「国語」の部分)が変更さえるマクロを作りたいのですが、うまくできません。 ちなみに、ドロップダウンリストの"J"を選択した場合は、ブックBのシート"国語"を参照し、リストの"M"を選択した場合は、ブックBのシート"数学"を参照し、リストの"A"を選択した場合は、ブックBのシート"美術"を参照するようにしたいです。 よろしくお願いします。 また、マクロを使わずして出来るようでしたら、その方法も合わせて教えて下さい。

専門家に質問してみよう