• ベストアンサー

vba 数式を入れる 列を数値にしたい

vbaで数式をセルに入れる際に、アルファベットで列を指定するのではなく 数値で指定する場合、どうすればいいでしょうか? 例えば、A1セルに Sub Sample() Cells(1, 1) = "=a2+a3" End Sub と言う結果にしたい場合、 a列の部分も数値で指定したいです。 Sub Sample() Cells(1, 1) = "=" & Cells(2,1) & "+" & Cells(3,1) End Sub こういうことをやりたいのですが これだとエラーになってしまいます。 方法を教えてください。

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.3

 A1セルに入力したいワークシート関数が =A2+A3 ならば、列番号と行番号がともに相対参照となっていて、A2セルは(関数を入力するセルである)A1セルの1行下の同じ列のセルであり、A3セルはA1セルの2行下の同じ列のセルであるのですから、 Sub Sample() Cells(1, 1).FormulaR1C1 = "=R[1]C+R[2]C" End Sub となります。  尚、同じ関数(「=A2+A3」)を、例えばB3セルに入力する場合には、 Cells(3, 2)FormulaR1C1 = "=R[-1]C[-1]+RC[-1]" になりますし、セル番号を絶対参照の =$A$2+$A$3 とする場合には、 Cells(1, 1).FormulaR1C1 = "=R1C2+R1C3" になります。

vssgzbjsukh
質問者

お礼

どうもありがとうございました。

その他の回答 (3)

回答No.4

流儀は様々あろうかと思いますが、ループで回そうといったお考えなら、こんな感じが分かりやすいかもしれませんね。 cells(1,1).formula = "=" &cells(2,1).address(0,0) &"+" &cells(3,1).address(0,0)

vssgzbjsukh
質問者

お礼

どうもありがとうございました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは、お邪魔します。 ご質問に対する解釈が揺れますが、お求めなのは、計算結果ではなくて、 「指定の数式そのもの、をセルに設定する際に、列参照を数値で表現したい」 という風に受け止めています。 もっとも、例示のようなシンプルな数式ですと、このような処理が実際に必要なのか、 多少、疑問は残ります。 ただ、私自身、その手のコードを何度か掲示したことがありますし、 ニーズというか、そうした方が合理的な場面も、あるにはありますから、 「簡素化した数式を例示しているが、実際には複雑で、他に有効な方法がない」? という場合を想定しての回答、ということになります。 ひとまず、(非VBA)Excel一般機能のセル参照について、 「相対参照と絶対参照」、「R1C1 参照形式」等、基本事項に自信がない場合は お浚いしておいてください。 特に、Excel一般機能の「相対参照と絶対参照」は、 VBAからの数式設定に大きく関係してきます。 多くの場合、相対参照/絶対参照を組み合わせて数式を指定することで、個別の参照について、 「行や列をいちいち指定する必要」がある場面は、限られていると思います。 一応、誤解する閲覧者さんがいるといけないので、「行や列をいちいち指定しなくても」 ある程度のことはできることを示しておきます。 ' ' 〓〓〓 ' ' 〓〓〓 Sub check0() ' 相対参照   Range("F1:J5").Formula = "=A1" End Sub Sub check1() ' 相対参照   Range("B2,E2,B5,E5").Formula = "=A1" End Sub Sub check2() ' 行は相対参照、列は絶対参照   Range("B2,E2,B5,E5").Formula = "=$A1" End Sub Sub check3() ' 行は絶対参照、列は相対参照   Range("B2,E2,B5,E5").Formula = "=A$1" End Sub Sub check4() ' 絶対参照   Range("B2,E2,B5,E5").Formula = "=$A$1" End Sub ' ' 〓〓〓 ' ' 〓〓〓 本題です。 .Value プロパティ、.Formula プロパティ、等は、 一応は省略可能ですけれど、 「値を取得する」ということや「数式を設定する」ということが、 読み手に解り易く伝わるように書く方がベターです。 > Cells(1, 1) = "=" & Cells(2,1) & "+" & Cells(3,1) この記述では、.Value プロパティが3カ所省略されているという意味になってしまいますが、 もしも、プロパティを省略しないで書いてみようという意識が働けば、 それだけで、自力解決に大きく近づける課題だったかも知れません。 以下、【直接の回答】を含め、具体例を(他にもありますが)5種類、挙げてみます。 ' ' 〓〓〓 ' ' 〓〓〓J 記法:絶対参照 → .Address(0, 0) → 結果:相対参照  =A2+A3 【直接の回答】 Sub test0()   Cells(1, 1).Formula = "=" & Cells(2, 1).Address(0, 0) & "+" & Cells(3, 1).Address(0, 0) End Sub ' ' 変数を用いる場合。 Sub test0i()   Dim iCol As Long   iCol = 1   Cells(1, iCol).Formula = "=" & Cells(2, iCol).Address(0, 0) & "+" & Cells(3, iCol).Address(0, 0)   ' ' または '  Cells(1, 1).Formula = "=" & Cells(2, iCol).Address(0, 0) & "+" & Cells(3, iCol).Address(0, 0) End Sub ' ' 〓〓〓 記法:絶対参照  → ConvertFormula → 結果:相対参照  =A2+A3 ' ' VBAで喩えるなら、Cells(RowIndex, ColumnIndex) の要領で数式中のセル範囲をR1C1指定。 Sub Re8374499()   Cells(1, 1).Formula = Application.ConvertFormula("=R2C1+R3C1", xlR1C1, xlA1, xlRelative) End Sub ' ' 変数を用いる場合。 Sub Re8374499i()   Dim iCol As Long   iCol = 1   Cells(1, iCol).Formula = Application.ConvertFormula("=R2C" & iCol & "+R3C" & iCol, xlR1C1, xlA1, xlRelative)   ' ' または '  Cells(1, 1).FormulaR1C1 = Application.ConvertFormula("=R2C" & iCol & "+R3C" & iCol, xlR1C1, , xlRelative) End Sub ' ' 〓〓〓A 記法:絶対参照 → 結果:絶対参照 =$A$2+$A$3 【もっともシンプル+省略形】 ' ' VBAで喩えるなら、Cells(RowIndex, ColumnIndex) の要領で数式中のセル範囲をR1C1指定。 Sub testA()   Cells(1, 1) = "=R2C1+R3C1" End Sub ' ' 変数を用いる場合。 Sub testAi()   Dim iCol As Long   iCol = 1   Cells(1, iCol) = "=R2C" & iCol & "+R3C" & iCol   ' ' または '  Cells(1, 1) = "=R2C" & iCol & "+R3C" & iCol End Sub ' ' 〓〓〓B 記法:オフセット(相対)参照 → 結果:相対参照  =A2+A3 ' ' VBAで喩えるなら、Cells(1, 1).Offset(RowOffset, ColumnOffset) の要領で数式中のセル範囲をR1C1指定。 Sub testB()   Cells(1, 1).FormulaR1C1 = "=R[1]C[0]+R[2]C[0]" End Sub ' ' 変数を用いる場合。 Sub testBi()   Dim iCol As Long   iCol = 1   Cells(1, iCol).FormulaR1C1 = "=R[1]C[" & iCol - 1 & "]+R[2]C[" & iCol - 1 & "]"   ' ' または '  Cells(1, 1).FormulaR1C1 = "=R[1]C[" & iCol - 1 & "]+R[2]C[" & iCol - 1 & "]" End Sub ' ' 〓〓〓C 記法:オフセット(相対)参照 → 結果:相対参照  =A2+A3 ' ' VBAで喩えるなら、Cells(1, 1).Offset(RowOffset) の要領で数式中のセル範囲をR1C1指定。 ' ' 数式を設定するセルと参照先のセルが同じ列の場合は、列位置を省略できる。 Sub testC()   Cells(1, 1).FormulaR1C1 = "=R[1]C+R[2]C" End Sub ' ' 変数を用いる場合。 Sub testCi()   Dim iCol As Long   iCol = 1   Cells(1, iCol).FormulaR1C1 = "=R[1]C+R[2]C" End Sub ' ' 〓〓〓

vssgzbjsukh
質問者

お礼

どうもありがとうございました。

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

文字列の結合(&)では,「空っぽのセルを自動でゼロにしてくれる」機能が働かないので,エラーになります。 簡易には Cells(1, 1) = "=" & (Cells(2,1)+0) & "+" & (Cells(3,1)+0) とかでもいいですし,あなたのマクロを動かす「前に」A2,A3に先に何か数字を記入しておくだけでも,エラーは回避できます。 #蛇足:以下のコメントにはフォロー不要です あなたが実際の所なにをしたいのかさっぱり不明ですが,あなたのご説明の通りだとすると結局A1セルに =2+3 のように記入されるだけなので,素直に cells(1,1) = cells(2,1) + cells(3,1) のようにしておいて,「計算後のコタエの数字」を記入しておくのと,なんら変わり有りません。

vssgzbjsukh
質問者

お礼

どうもありがとうございました。

関連するQ&A

  • VBAでセルデータの転記(文字列)

    VBAでセルのデータを下記のように他のセルに持っていく場合、文字として入れてある数字(例えば先頭に0がつくようなもの)は、自動的に数値に変えられて0が消えてしまいます。 また、長いものは指数表示になってしまい、15桁を超えるものは後ろが0になってしまいます。 持っていく先のセルを文字列に設定しておけばいいのでしょうが、持っていく元データが全て文字列ではなく、数値の場合もあります。 元データが数値であれば数値として、文字列であれば文字列として持っていくにはどうすればいいのでしょうか? Sub test() Cells(3, 3).Value = Cells(1, 1).Value End Sub

  • 列をアルファベットではなく数値で指定するには

    Vbaで条件付き書式を付ける場合、 列をアルファベットではなく数値で指定するにはどうすればいいですか? Sub Macro() Dim i As Long i = 1 Columns(i).Select Selection.FormatConditions.Delete Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=A1=""aaa""" Selection.FormatConditions(1).Font.ColorIndex = 3 '文字色を赤にする End Sub この場合の、 Formula1:="=A1=""aaa"""のA1を Cells(1,i)みたいにしたいのですが、やり方を教えてください。

  • エクセルVBAについてお尋ね致します。数式が入力されたセルを異なるセル

    エクセルVBAについてお尋ね致します。数式が入力されたセルを異なるセルの条件によって「値」のみ残す方法を模索しております。 使用する列および行の例 列=A、B  行=5~10、15~20、25~30(A列、B列共通) 上記対象セルの内訳 A列(参照セル)=数値 ※空欄の場合もあります B列(変更セル)=数式(Aセル数値 * ○○%) ※B1セルの例:=IF(A1="","",A1*10%) のような数式が記入されております。 (例) Private Sub CommandButton1_Click() ’参照セルの指定 ("A5:A10","A15:A20","A25:A30") のようなコード*** ※現在はAセルの範囲としておりますが、後に変更の可能性を有しますので範囲指定が可能な形式を望みます。 ’変更セルの指定 セル指定のコード*** ※現在はBセルとしておりますが、これも後に変更の可能性を有しますのでA・B・Cのような入力(もしくはA=1、B=2、C=3)による指定可能な形式を望みます。 ’参照セル(Aセル)に数値が入力されている場合、数式から得られた変更セル(Bセル)の値を”値のみ”で残す。 実行コード*** ※参照セル(Aセル)が空欄の場合は変更を望まないので、変更セル(Bセル)は何も致しません。(数式のまま残す) End Sub このようなマクロを望んでおります。 イメージとしては数値がAセルに入力されていた際に同じ行のBセルにおいて右クリックコマンド内〔コピー〕 → 〔形式を選択して貼り付け〕 → 〔値〕の貼り付けを行うことをご想像下さい。 列や行の変更が予想されるので変更が可能なことを望んでおりますが、結果が伴えば他の体裁は気に致しません。 お手数ですがご教授宜しくお願い致します。 以上

  • 列 数値で指定するにはどうすればいいでしょうか?

    ActiveSheet.PageSetup.PrintArea = "$A$1:$C$10" このような書き方を、列の値をアルファベットで 指定するのではなく 数値で指定するにはどうすればいいでしょうか? cells(1,1) cells(10,3) のような方法で指定したいです。

  • vbaにおいて、セルのエラー検出に関して

    vbaにてセルに入力する数式のエラー検出に関して教えてください。 iserror関数で検出できない数式を簡単に検出する方法ありませんか? sub test() dim str as string str=" C2*C3* " cells(5,7).value=str end sub 簡単なVBAのコードですが、*の右側はセル相対参照もセル絶対参照も数値も入っていませんので、数式としてはエラーです。 strの値を(5,7)のセルに放り込んだら、vbaのエラーで停止してしまいます。 かといって、iserror()を使って、 sub test() dim str as string str="C2*C3*" if iserror(str)=true then else cells(5,7).value=str end if end sub としても、エラーをはじいてくれず、VBAでもエラーを出力してしまいます。 力業で、strの数式エラーをはじくしか方法はないのでしょうか? インターネットを調べているのですが、的を射た答えが出てきません。 どなたか詳しい方ご教示ください。

  • Excel2002において、数式と数値を別に数えたいのですが。

    Excelで表を作っています。 表の最後の列にそれぞれ、その列の合計が入っていますが、基本的にそれは数式による計算結果です。 ですが、時々直接数値を入力したセルがあります。 1.数式による計算結果のセルが30個 2.そうでない数値のセルが10個 のとき、 1.30 2.10 というふうに数えたいのです。 できれば関数がいいのですが…(VBAは手に余るので) できるかできないかだけでもいいので、どうかお答えください。

  • VBA 文字列と数値の混在

    Excel VBA 独学中の初心者です。独学中の初心者です。 データ型に関する以下の疑問についてお答えいただける方、よろしくお願い致します。 疑問1.「文字列 & 数値」でエラーにならず、結果は文字列になるようですが、これはVBAの規則上当たり前のことでしょうか。 疑問2.InputBox関数の戻り値は、Typeを省略した場合文字列と思いますが、これを数値型の変数に代入してもエラーは発生しませんでした。これも当たり前のことでしょうか。 具体例は以下です。 ------------------ Option Explicit Sub 文字列と数値の疑問() '初期設定 Cells.Clear Range("A1").Select '本題はここから Dim i As Long Dim j As Long Dim strRange As String Dim strInput As String '------------------ '疑問1の例 i = 2 strRange = "A" & i '疑問1:文字列と数値変数(長整数型)を文字列連結演算子で連結してもエラーにならない。・・・なぜ? '結果は1つの文字列→strRange ="A2" '例 Range(strRange).Select '動作OK Range(strRange) = i '動作OK '------------------ '疑問2の例 strInput = InputBox("選択行を入力してください", , "4") 'strInputは文字列型変数 j = strInput '疑問2:数値変数(長整数型変数)に文字型変数を代入してもエラーにならない・・・なぜ? '結果は長整数型変数(数値) j=4 (Input BOX をデフォルトでOKしたとき) '例:以下の両方とも動作OK '1) strRange = "A" & strInput '文字列 & 文字列 →文字列 strRange ="A4";疑問なし Range(strRange).Select '動作OK Range(strRange) = strInput '2) Cells.Clear '確認用にクリアスクリーン Range("A1").Select '確認用にセル位置移動 strRange = "A" & j '文字列 & 数値 →文字列 strRange ="A4";疑問1と同じ Range(strRange).Select '動作OK Range(strRange) = j '動作OK End Sub

  • vbaのFindメソッドで取得するにはどうすれば

    A1に「あ」B1に「い」と入れて、 A2に「=A1&B1」としました。 この時、A2は「あい」と表示されます。 今回やりたいことは、 Sub test() Debug.Print Cells.Find(What:=" あい").Row End Sub で、2を返したいのですが、 実行時エラー91になってしまいます。 セル内に該当の文字列がないからだと思いますが、 数式でつなげた文字列を、 vbaのFindメソッドで取得するにはどうすれば良いでしょうか?

  • VBA 計算結果を数値ではなく、数式で表示したい。

    配合表から配合比率を計算するVBAを組みたいのですが、実際の数値ではなく計算式を表示したいです。 こちらが自分で記入したコードです。 Q列とAA列とAB列をかけて、100で2回割った結果をAC列に表示します。同じ行にすべての数値が記入されないので、AB列からそれぞれ必要な列の数値を取得しています。 Sub 配合比率仮() Dim i As Integer Dim AB Dim Q Dim AA Range("AB3").Select For i = 1 To 500 If ActiveCell.Value = "" Then     '空白の場合下のセルへ ActiveCell.Offset(1, 0).Select Else '配合割合の数値がある場合 AB = ActiveCell.Value         'アクティブセルの数値の取得 Q = ActiveCell.Offset(0, -11).End(xlUp).Value        '重量比率を取得 AA = ActiveCell.Offset(0, -1).End(xlUp).Value        '配合割合の左列を取得 ActiveCell.Offset(0, 1) = s * t / 100 * u / 100       '製品の配合比率を計算(ここを数式にしたいです) ActiveCell.Offset(1, 0).Select       '下のセルへ End If Next i End Sub 上記コードでは数値が表示されます。数式で結果を表示させる方法を教えてください。Formula/FormulaR1C1プロパティを使うと思ったのですが、うまく動くコードが書けませんでした。初心者に毛が生えたようなもので上記コードもなっていないものかとは思うのですが、どうぞお力を貸してください。

  • VBA VLOOKUP 検査値が数値だと#N/Aになってしまう

    VBAでVLOOKUPをセルに表示させるようにしましたが、検査値が数値になると#N/Aになってしまいます。 IFと組み合わせて検索セルがブランクのときは空白、そうでないときはVLOOKUP数式をもともと1000行くらい埋め込めばいいのかもしれませんがそうすると1000行を超えたらどうする?など柔軟性がいまいちなので、行数が変わっても対応できるようVBAでLOOPにしようと思いました。 アクティブシートのA列の値をシート「マスタ」のA列から探してきて、「マスタ」のB列の内容をアクティブシートのB列に表示させたいです。 最終行 = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row j = 2 Do Until j = 最終行 + 1  Cells(j, 2).Select  Selection.Formula = "=Vlookup(""" & Cells(j, 1) & """,マスタ!A:B,2,false)"  j = j + 1 Loop 検索が数値の場合、#N/Aになります。 数値でも文字列でもvlookupで拾えるようにするにはどのようにしたらよいでしょうか。

専門家に質問してみよう