• ベストアンサー

VBAに関する質問

VB初心者です。ExcelのVBAに関していくつか分からないことがあるのでアドバイスを下さい。 ・ファンクションプロシージャを用いて (C8*D8^3-A8)+(C9*D9^3-A9)+(C10*D10^3-A10)+・・・・ (C8、D8、A8は定義した関数の引数) みたいな計算をVBAでしたいのですが、セルの番号を一つずつ上げるにはどうしたら良いのでしょうか? ・ 逆に、 (C8*D8^3-A1000)+(C9*D9^3-A999)+(C10*D10^3-A998)+・・・・ といったひっくり返ったsum計算をしたいのですが、その方法を教えて下さい。 よろしくお願い致します。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

複数の同じような質問は情報が分散または重服しますので片側に集約するようにしましょう 変数として何をグループ化するればいいのかをよく考えましょう > (C8*D8^3-A1000)+(C9*D9^3-A999)+(C10*D10^3-A998)+ であれば C列用、D列用、A列用の3つがあればループできそうですが違いますか 初期値を C8,D8 A1000を参照 C,Dは増加、Aは減少といった具合にすればいいだけです RangeでやるかCellsでやるのかは自分の理解しやすいほうでいいと思います Cells(r,c)とCells(r,c).Valueは同義です Cells関数のデフォルトのプロパティがValueであるため省略された場合はValueの値が関数の戻り値になります VBAに関しての良書は存じません … というよりほとんど独学でやりましたので … VB6・VC6付属のMSDNおよびMicrosoftのMSDNサイトを参照しておりました

その他の回答 (4)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

> VBAの方がadvancedだから優れているのでしょうか? ではありません VBAは Visual Basic for Application の略称です つまり VisualBasicのサブセット(完全な互換性が無い)であり付随するアプリケーションに特化したものになっています ExcelVBAとかAccessVBAなどのようにアプリケーション名をつけて記述する場合もあります

motarou
質問者

お礼

ありがとうございます。 出来れば、下記の質問にも答えて頂けないでしょうか? 何卒よろしくお願い致します。 例えばf(x,y,z)という関数で、変数であるx,y,zにセルA8やB8、C8といったものを入れることで (C8*D8^3-A1000)+(C9*D9^3-A999)+(C10*D10^3-A998)+・・・・ みたいな連番の計算が出来るようにしたいのですが。 ・それと手元にある本には、Cells(rw,col)とCells(rw,col).Valueは同じと書かれてあるのですが、厳密には異なるものなのでしょうか? ・出来ればこういったExcel VBA のファンクションプロシージャに関して良い本がありましたら教えて下さい。 お願いいたします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

VBA的にやるならRangeオブジェクトや配列の活用を考えましょう 最近のパソコンならさほど気にする事もありませんが Cellsメソッドは結構コストのかかる命令です C8:D20の範囲のデータなら dim arData arData = Range("C8:D20").Value などとすれば arData(0,0)にC8 arData(0,1)にC9 arData(1,0)にD8 arData(1,12)にD20 の値を取得できます

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

プログラムでは関数式のように+とセル番地をべたべた並べて書くのでなく、式の部分まとまりを繰り返します。 繰り返しはForNextを使うとして S=0 For i=1 to 18 s=s+cells(i,"C")*Cells(i,"D")-Cells(i,"A") Next i のようにします。これ合計を出すというかすべてのプログラムの第1歩の課題ですよ。 セルの値をどうコードで捉えるかもVBAの基本中の基本です。 ーーー >VB初心者です VBAとVBは区別して表現したほうが良い。文法は似ているが、学ぶべきことは、内容が別物です。

motarou
質問者

お礼

アドバイスありがとうございます。 出来ればVBとVBAの違いを教えて下さい。 VBAの方がadvancedだから優れているのでしょうか? お願いいたします

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

>(C8、D8、A8は定義した関数の引数)~~ それぞれが、変数という意味なのでしょうか? 変数ではなく、セル位置を示していると解釈して・・・ (違っていたら失礼) まず、セルの指定はCells(rw,col)またはRange("C10")などのように指定する必要があります。値をとるならCells(rw,col).Valueなどのようになります。 それなので、セルの指定を変数化して、例えば result = 0 For i = 8 To ○ result = result + Cells(3,i).Value*Cells(4,i).Value^3 - Cells(1,i) Nest i のような指定の仕方をすればよいのでは? どれかが減少していっても、(1008-i)のように考えれば良いでしょう。

motarou
質問者

お礼

ありがとうございます。 かなり理解が深まりました。 ・少し質問の仕方が悪かったのですが、 例えばf(x,y,z)という関数で、変数であるx,y,zにセルA8やB8、C8といったものを入れることで (C8*D8^3-A1000)+(C9*D9^3-A999)+(C10*D10^3-A998)+・・・・ みたいな連番の計算が出来るようにしたいのですが。 ・それと手元にある本には、Cells(rw,col)とCells(rw,col).Valueは同じと書かれてあるのですが、厳密には異なるものなのでしょうか? ・出来ればこういったExcel VBA のファンクションプロシージャに関して良い本がありましたら教えて下さい。 お願いいたします。

関連するQ&A

  • エクセル VBA セル範囲を指定

    functionプロシージャを作ろうとしてます。いわゆるユーザ定義関数です。 エクセルの関数でSUMが用意されており、SUM(セル範囲)のように書けば合計を返します。 同じようにセル範囲の指定を受けて計算結果を返すfunctionを作りたいのです。 function example(セル範囲 As double,・・・) As double 任意の範囲を指定して、その値を使って計算したいのです。 ・セル範囲の書き方というか、フォーマットの書き方 ・プロシージャ内で計算に使うために配列に読み込む方法

  • VBAの質問です2

    たびたび申し訳ありません。 繰り返し処理の中でSUM関数を使うときに、引数をA1のような書き方ではなくて(1,1)のようにしたいのですが、そうするとエラーになってしまいます。 これはVBAの問題ではなくて単にSUM関数の引数を(1,1)のように書きたいときにはどうすればいいかという問題だと思いますが。 =SUM((30*I-18,5):(30*I+8,5)) ではだめなんです。 よろしくお願いいたします。

  • VBAのマクロをシート内の式で使いたい

    VBAで、マクロの関数をエクセルの式で使うことは可能でしょうか? 引数や戻り値の制約も知りたいです。 引数はExcel側ではセル値B1とかになりますが、VBA側では何か対策でもあるのでしょうか? 'VBA public function test(byval a as integer, byval b as integer) as integer test = a + b end function 'エクセル側 C1セルに以下の式 =test(A1, B1)

  • エクセルのユーザー定義関数で(VBA)

    エクセルのVBAで、セルに「=SheetName」と書き込めば、その関数を書き込んだセルが属するシート名をセルに代入さるようなユーザー定義関数を作りたいと考えています。 で、標準モジュールに Public Function SheetName(test) SheetName = ????? End Function と、書き込んでふと止まりました。 ユーザー定義関数を書き込んだシートの名前ってどうやって取得すればいいのでしょうか?VBでいうSenderみたいなのってあるんでしょうか? どなたか?詳しい方教えて頂けないでしょうか? 宜しくお願いいたします。

  • VBAを使わず、計算式を使いまわし

    エクセルで勤務表を作っています。 たとえば、B2に出勤時間を、C2に退社時間を入力すると、D2に勤務時間が表示されます。 現在の計算手法は、A1、B1の値を別セルからそれぞれ参照し、計算をし、結果を別セルに表示させます。その結果をC1セルが参照して、C1セルに表示させるような手法をとっています。 ※話を簡単にするための一例です。この程度ならダイレクトにC1に結果を表示させることは簡単ですが、実際にはさまざまな条件があるため、計算はもっと複雑です。 この手法だと、同じ計算式を日にちごとに用意しなければいけません。 計算式がそこそこ複雑なので、毎日分用意すると、メンテナンスやファイルサイズの問題などあまり よろしくないと思っています。 そこで、VBAのFunctionプロシージャのように、計算式は1セットのみで、毎日の出勤、退勤時間を引数で渡して、結果を返すような方法はできないのでしょうか?

  • ExcelのVBAでセルに指定したユーザ関数につい

    ExcelのVBAのユーザ関数について 例えば、 Excelのあるセル、例えば、C1セルの値を引数として、「Function 練習()」 という、ユーザ関数に渡します。 関数内では、引数で渡されてきた値のセル番号を判断し、その次のセルに 値を設定します。 つまり、C1セル(1,4)の値をわたしているので、D1セル(1,5)に値を 設定したいのですが、うまくいきません。 「1つ以上の循環参照が発生しています。循環参照とは、数式が直接的 または間接的に自身のセルを参照している状態を指します。これにより、 計算が正しく行われない可能性があります。 循環参照を削除または変更するか、数式を別セルに移動してください。」 が最初に表示されますが、その後、期待した結果になっていません。 何が起きていて、何がたりないのでしょうか。 よろしくお願いします。 ■内容 A B C D 1 111 222 あ =練習(C1,"-") 2 333 444 い 3 555 666 う 4 777 888 え 5 999 000 お ■関数 Function 練習(myTar As Range, word As String) As String If Len(myTar) = 0 Then 練習 = "" Exit Function End If On Error GoTo era CurRow = myTar.Row CurCol = myTar.Column MsgBox CurRow & ":" & CurCol & ":" & Cells(CurRow, CurCol) Cells(CruRow, CurCol + 1) = "a" 練習 = "○" Exit Function era: 練習 = "#VALUE!" End Function

  • excel vbaのプログラムが作成できません

    プログラミングでexcel vbaを勉強しています。 excel vbaのプログラムでフィボナッチ数列のプログラムを作れという問題なんですけど、正直全くわかりません。誰かこのプログラミングを教えてください。お願いします。 フィボナッチ数列は次のように帰納的に定義される。 fib(1) = fib(2) = 1 fib(n) = fib(n - 1) + fib(n - 2) (ただしn >= 3) この関数fib(n)を定義せよ。ただし引数nはInteger型、fib関数の返す値はLong型とする。 またfib関数を呼び出す適当なメインプロシージャを定義し、A1セルからA20セルまでに fib数列の1~20番目の値を書き出すようにせよ。 という問題です。ほんとに困ってますお願いします

  • VBAに関する種々の質問

    VBAに関していくつか質問させて下さい。 ・ファンクションプロシージャでは Function Fun(x) ・・・ End Function という形で関数を定義しますが、この関数の中でこれとは別の関数を定義して使いたい場合にはどうすれば良いのでしょうか? Function Fun(x) ・・・ Function Fun2(x) ・・・ End Function ・・・ End Function みたいに入れ子状にすれば良いのでしょうか? ・Range()を使って、 Range(A1)*Range(A2)+Range(B1)*Range(B2)+・・・ ということは出来ないのでしょうか?こういうのはCellsを使うしかないのでしょうか? ・Int()で整数であるということ定義出来ますが、浮動小数点であるdouble()というのが効かないのはなぜなのでしょうか? Dim as doubleだと効くのですが。 何卒よろしくお願い致します。

  • 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で行いたい

    A1のセルに "100+5n" という文字式が入っている状態で VBAにてこのセルの文字式計算を行いB1のセルから順に結果を出力したいと思っています。 "n"は1から順に指定された数まで1づつ増えていくようにし B1のセル:105、C1のセル:110、D1のセル:115 ・・・・ と結果がなるようにしたいのですが、VBAでどのように記述すればいいのか悩んでいます。 VBAを使わずにExcelの関数で計算できるのならそれでもよいと思っています。