• ベストアンサー

VBAで & の意味は

Excel VBAの参考書に下のコードがありました。 最右列にその行のデータの合計を求める計算式です。 Cells(i, r).FormulaR1C1 = "=sum(RC[" & -(r - 2) & "]:RC[-1])" & 演算子は文字列などの連結に使用すると理解していますが、この例の場合、& はどんな役割(意味)を持っているのでしょう。どうかお教えください。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.5

位置がずれるかもしれないので全角で書きます。(等幅フォントで見る必要があるかもしれません) ”=sum(RC[” & -(r-2) & ”]:RC[-1])” │        │   │    │ └───┬────┘   └──┬─┘     │           │     └──────┬────┘            ↓        ”=sum(RC[-5” & ”]:RC[-1])”        │          │   │         │        └────┬─────┘   └────┬────┘             │              │             └──────┬───────┘                    ↓        ”=sum(RC[-5]:RC[-1])” 上記の意味なので、『” & -(r-2) & ”』に着目してこの算式をみてはいけないでしょう。 『”』は最初の文字列を指定する『”』、最後の文字列を指定する最初の『”』です。 "=sum(RC[" & -(r - 2) & "]:RC[-1])"  の   "=sum(RC["  を『式1』   -(r - 2)   を『式2』   "]:RC[-1])"  を『式3』 とすると、『式1』&『式2』&『式3』となります。 式1、式3は文字列なので、『""』で囲まれています。 式2は数値なので『""』で囲まれていません。演算時にバリアント型の処理が行われ文字に変換されます。 『式1』&『式2』&『式3』が →『式1と式2の連結』&『式3』 →『(式1と式2の連結)と式3の連結』 と考えていますが。。。 数値演算  100+20+3=120+3=123 と同じ考えでしょうか。 質問の式は文字列演算  "1" & "2" & "3" ="12" & "3" ="123" と同様になります。 >バリアント型というのは万能型(なんでもOK)という理解でいいでしょうか。 この場合は、文字と数値の両方の意味を持つ変数です。

shonenA
質問者

お礼

ご回答感謝いたします。今回のご教示でやっと理解できました。 式1  "=sum(RC["  式2  -(r - 2)  式3  "]:RC[-1])" の三つの式だったんですね。そいて式2は数値なので "" で囲わない。 ずっと [ ]の中ばかり囚われていました。おかげさまでよく分かりました。これでよく眠れます。また、教えてください。  

その他の回答 (4)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

& 演算子は、2つの式に対して文字列連結を行います。(文字列に対してだけではありません) ここでいう式とは、文字列、数値、オブジェクトのいずれかに評価される、キーワード、演算子、変数、定数の組み合わせです(Helpより)。平たく言えば、文字列だけではないということです。 式1 & 式2   この演算においては、式1または式2が   文字列でない場合は、常に内部処理形式が文字列型のバリアント型に変換されます。   その演算結果のデータ型は、両方の式が文字列式のときは、文字列型になりますが   それ以外のときは、内部処理形式が文字列型のバリアント型になります。     バリアント型 (Variant)       →数値および文字列の基本的なデータ型以外に、        日付、ユーザー定義型、Empty 値、Null 値などの        特別な値を持つことができる特別なデータ型。 質問の例を考えると、   Cells(i, r).FormulaR1C1 = "=sum(RC[" & -(r - 2) & "]:RC[-1])"   "=sum(RC[" & -(r - 2) & "]:RC[-1])"     ↓   "=sum(RC[" & -5 & "]:RC[-1])"     ↓              r=7   "=sum(RC[" & "-5" & "]:RC[-1])"     ↓              -5がバリアント型変数になる   "=sum(RC[-5" & "]:RC[-1])"     ↓              最初の文字列と"-5"の文字列連結。                    "=sum(RC[-5" はバリアント型変数   "=sum(RC[-5]:RC[-1])"                    再度文字列連結

shonenA
質問者

補足

ご回答感謝いたします。 当方の頭が硬いのか、悪いのか、理解するにはもう少し時間がかかりそうです。 教えてください。 [" & -(r - 2) & "] と書く必然性が分からないのです。この例の場合、これ以外の記述方法はないのでしょうか。 "=sum(RC[" & -(r - 2) & "]:RC[-1])" 'r が 7 のとき     ↓ "=sum(RC[" & -5 & "]:RC[-1])" ここまでは分かります。     ↓ "=sum(RC[" & "-5" & "]:RC[-1])"     ↓ "=sum(RC[-5" & "]:RC[-1])" ここが分かりません。バリアント型というのは万能型(なんでもOK)という理解でいいでしょうか。よろしくお願いします。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.3

VBやVBAでは、変数に対する自動型変換の機能があります。 Aという文字列の変数に 1を代入した場合、"1"となり 代入されるようです。 A=1 は A="1" となります。 自動的に 変換されるのです。

shonenA
質問者

お礼

お礼を申し上げるのを忘れていました。 何回も詳しく教えて下さったのに、当方の理解力が足りなくて申し訳ありませんでした。No.4,5のかたのお話で、ようやくあなた様の仰っていることが分かりました。また、教えてください。どうもありがとうございました。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.2

rが 7なのでしょうか? まず r-2 で 7-2となり、 5となります。 そして -(5)で "=sum(RC[" & -5 & "]:RC[-1])" となります。 連結するときに -5が ”-5”となるのだと思います。

shonenA
質問者

補足

たびたびありがとうございます。まだ理解できていません。もう少し教えてください。 この場合、r は 7 ですので ( ) の中は 5 になるのは分かります。( ) の前に - 符号がありますので [ ] の中は -5 になりますよね。でも、" & ____ & " がないと正しい計算結果にならずにエラーになってしまいます。& は何と何を連結しているのでしょうか。また、" " はなぜ必要なんでしょうか。[-5] と ["-5"] はどう違うのでしょうか。よろしくお願いいたします。

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

文字列の連結だと思います。 整数の型を文字列に代入すると 文字列となります。 連結する時点で、文字列に変わるのだと思いますが・・・。

shonenA
質問者

補足

早速のご回答感謝いたします。 このプロシージャを実行すると正しい計算結果がでます。 "=SUM(RC[-5]:RC[-1])" と同じ結果です。ですので & の役割が???なのです。変数 i,r と関わりがありそうなんですが…。

関連するQ&A

  • Excel VBAの SUM関数について質問です。

    Excel VBAの SUM関数について質問です。 SUM関数で合計の値を出す場合、 SUM(A1:A5)という関数で合計を出しますが SUM(sheet2.cells(1,1),sheet2.cells(5,1)) と言ったようにCellsで指定はできないのでしょうか? 複数の列にVBAのプログラムで合計の値を出したいのです。 WorksheetFunction.SumではSUM(A1:A5)のように 自動計算にならないと思うので・・・

  • エクセル VBAコードの書き方を教えてください。

    エクセル VBAコードの書き方を教えてください。 今回は、VBAで掛け算をしたいのですが、 コードが間違っているためか実行ができません。 VBAコードのどこに不備があるか教えてください。 <条件> *最終行(H列で判断)を選択し、  I2(2行、I列)~I最終行(最終行,最終行のI列)までの  範囲を計算したい。 *たとえば、I2であれば、F2×G2×H2×0.01の値を代入したい。  I最終行であれば、F最終行×G最終行×H最終行×0.01の値 EX) 添付ファイルの場合、I2=500、I4=125、にしたい。 <参考> Sub SURYO() Dim r As Long With Sheets("Sheet1") For r = 2 Cells(r,9).value = Cells(r,6) * Cells(r,7) * Cells(r,8) Next End With End Sub よろしくお願いします。

  • Excel VBA 答えが0になってしまうのですがどうしたらなおりますか?

    こんばんはB列に上からいくつか数字が入力されているとします。 そのB列の最下行にSUM関数を入力させるマクロを作成しましたが、 なぜか計算結果が0になってしまいます。 循環になってしまっていたので反復計算にチェックをいれ、再計算させましたが思ったような答えが出ませんでした。 この計算結果が0になってしまう現象はどうやっって回避したらよいのでしょうか。合計欄をC列に変えると正常になりますが、B列に計算式を入力させると0になってしまうのは、どうしてなのでしょうか。 下記のコードが悪いのでしょうか?宜しくお願い致します。 (※通常にExcel2003を使用して、単純にセルどうしの引き算をしていても答えが0になってしまう場合があります。これも同じ循環なのかも知れませんので、回避方法を教えてください。) Sub SUM関数を入力する() Dim r As Integer '最下行 Dim m As Integer '対象列 Dim a As Variant Dim siki As Variant Worksheets(3).Activate r = Worksheets(3).Range("B65536").End(xlUp).Row + 1 Range("B" & Format(r)).Select m = 2 'R1C1方式で選択 a = "R" & 2 & "C" & 2 & ":R" & r & "C" & 2 siki = "=sum(" & a & ")" Range(Cells(r, m), Cells(r, m)).FormulaR1C1 = siki End Sub

  • エクセルVBAで解らないコードの意味を教えてくれませんか?

    お世話になります。 以前こちらでVBAで質問した際に下記のようなコードを教えていただきました。足し算のコードと言うのは分かるのですが、SUM以降の意味がどうも理解できませんでした。どなたか判る方教えていただけませんでしょうか? ws.Range(ws.Cells(r, 2), ws.Cells(r, c)).Formula = "=SUM([" & .Parent.Name & "]" & .Name & "!A3:A" & .Rows.Count & ")" よろしくお願いします。

  • エクセル 列の合計のVBA

    エクセルの縦の列におきまして たとえば列A1からA31までの セル 数値が 入っています、を 合計してA33に返すとして これをコードのなかの 一連の作業として行いたいので VBAで試行錯誤していますが Cells(33, "A").Value = Application.WorksheetFunction.Sum("Cells(1, "A"):Cells(31, "A")") Cells(33, "A").Value = Application.WorksheetFunction.Sum("A1:A31") いずれも稼働しません 宜しくお願い致します win10 office365

  • VBAでの行集計

    VBAでの行集計 いつもお世話になっております 今 マクロでの行集計で困っております。 お力をお貸し下さい m(__)m したいことは B列最終セルを見つけ出し 列の合計を出す 合計を右横最終セルまでコピーする 最終はR列までです そこで下記のマクロで合計は出しました Dim BeforePos As Long BeforePos = Range("B4").End(xlDown).Row Cells(BeforePos + 1, 2).Formula = "=SUM(B4:B" & BeforePos & ")" このセルの数式を右最終列までコピーをしたい それだけのことですがうまくいきません どうかよろしくお願いします

  • Excel VBA 選んだ行のあるセルの値を入れる

    Excel VBA 教えてください。 選んだ行の5列目にその(選んだ)行の10列目の値を入れたいのですがどのようにしたらいいのでしょうか。 ちなみに Sub Macro1() Cells(Target.Row, 5).FormulaR1C1 = Cells(Target.Row, 10) End Sub というように、マクロノ記録を利用してやってみましたができませんでした。 ご教授願います。

  • excel VBA For ~Next構文について

    excel VBA For ~Next構文についての質問です。 以下のようなマクロがあります(実際はもう少し複雑なことをやっていますが)     For i = 4 To 178      Cells(i, 16).FormulaR1C1 = "=RC[-2]-'" & Lm & "'!RC[-2]"     Next i これに「もし、『Cells(i, 1)』が空白なら、この処理は行わずに、次の行にすすめ」という指示を加えたいのですが、こんな簡単なこと(?)で行き詰ってしまっています。 とりあえず以下のように修正をしてみたのですが・・・    For i = 4 To 178    If Cells(i, 1) = "" Then GoTo ワープ:    Cells(i, 16).FormulaR1C1 = "=RC[-2]-'" & Lm & "'!RC[-2]"    ワープ:   Next i  これで一応こちらの求めている処理はできたのですが、もっと簡単に(もしくはすっきりと) できる方法はないでしょうか?  以上、よろしくお願いいたします。   

  • マクロ初心者です 実行時エラー1004 の解決方法を教えてください

    マクロ初心者です 仕事で使っていたエクセルのマクロにエラーが出てしまいました。 「実行時エラー1004アプリケーション定義またはオブジェクト定義のエラーです。」 os:win2000 x = 0 y = 1 w_prv = "*" Do While rc.EOF = False If w_prv = "*" Or w_prv <> rc.Fields("種別名") Then If w_prv <> "*" Then NewSheet.Cells(y, x).FormulaR1C1 = "=SUM(RC[" & (2 - x) & "]:RC[-1])" End If y = y + 1 x = 2 End If If y = 2 Then NewSheet.Cells(1, x) = rc.Fields("所属名") End If If x = 2 Then NewSheet.Cells(y, 1) = rc.Fields("種別名") End If NewSheet.Cells(y, x) = rc.Fields("数量計") x = x + 1 w_prv = rc.Fields("種別名") rc.MoveNext Loop NewSheet.Cells(y, x).FormulaR1C1 = "=SUM(RC[" & (2 - x) & "]:RC[-1])" y = y + 1 For i = 2 To x NewSheet.Cells(y, i).FormulaR1C1 = "=SUM(R[" & (2 - y) & "]C:R[-1]C)" Next NewSheet.Cells(1, x) = "合計" NewSheet.Cells(y, 1) = "合計" rc.Close Call closeDB End Sub ************************************************** NewSheet.Cells(y, x).FormulaR1C1 = "=SUM(RC[" & (2 - x) & "]:RC[-1])" ↑ ここでエラーが出ているみたいです。 エクセルのマクロで入力したデータをアクセスに落としそこから新しいシートで月ごとの統計をとれるようになっていたのですが、とれなくなってしまいました。 こんな説明でお分かりになりますでしょうか? まったくの初心者なので… よろしくお願いいたします。

  • 一日おきに列を一つ横に移動させるVBA

    1/11に『一日おきに列を一つ横に移動させるVBA』 という事で質問させていただいたのですが また問題が出てきたので、教えてください。 結局一日おきに行を下に移動させて記録させる事にしました。 Dim a As Long a = CLng(Date) - 37633 Sheets("日常管理").Cells(a + 3, 3).FormulaR1C1 = "=奇数!R5C14" Sheets("日常管理").Cells(a + 3, 4).FormulaR1C1 = "=奇数!R6C14" Sheets("日常管理").Cells(a + 3, 5).FormulaR1C1 = "=奇数!R7C14" 毎日のデータを記録させて行きたいのですが全部が同じ(最新の値)になってしまいます。 どうやれば、その日その日のデータが記入されていくのでしょうか?

専門家に質問してみよう