• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:なぜ、セルが埋まるのか?)

なぜ、セルが埋まるのか?

このQ&Aのポイント
  • セルが埋まる理由について教えてください。
  • 参考書のプログラムが読みきれないので、セルを埋める命令について教えてください。
  • セルの値に応じて別のセルを埋める方法について教えてください。

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

  • ベストアンサー
回答No.6

> 右辺が なぜ カラムが進むのか? おそらく I4:I9 が I5:I11 と進んで 計算されているはず・ > なぜなら、11(k)が 4から endr - 6 まで ことなる数値で埋まるのですから。 > そんな仕掛けが どこにあるのでしょう?? 特定の範囲に、同じ数式を設定しているはずなのに、セルに表示される数値が違うということですよね。 実際にセルに設定された数式を確認してみれば、何が起こっているか想像がつきそうですが。 特定の範囲に数式を設定する場合、数式中のセルの指定方法によって異なる結果になります。 I4:I9のように「相対指定」をすると、範囲の左上のセルではI4:I9で数式が設定されますが、その右隣のセルでは列が1つずれてJ4:J9と設定されます。また、下のセルでは行が1つずれてI5:I10と設定されます。これは、手動でセルの範囲を選択してコピーした場合でも同じ処理が行われます。 $I$4:$I$9のように行および列の指定の前に$を付けると「絶対指定」となり、前述のような処理は行われず、すべてのセルの数式はI4:I9を参照します。

007itochan
質問者

お礼

サンクス 理解しました。 絶対番地じゃないから 右辺もカラムが進む。 VB6やなもんで、勝手に変わるのが

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • anpauro11
  • ベストアンサー率28% (4/14)
回答No.5

補足を見ましたが、処理の目的というより考えた内容のようですね。 Range(Cells(4, 11), Cells(endr - 6, 11)).Formula = "=AVERAGE(I4:I9)/(AVERAGE(I4:I9)+AVERAGE(J4:J9))*100" の部分は単に範囲を指定してその範囲に一括で数式を設定するというものですね。 だからセルを埋めてるのはFOR~NEXTのループじゃないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • aoumiushi
  • ベストアンサー率45% (234/512)
回答No.4

よくわからんがF列の各行とその直後の行の数値を比べ、 マイナスならI列、プラスならJ列にその差を計算しているようですね。 K列では上から6行分の平均値の割合を出しているのかな? Cells(20000, 1).End(xlUp).Select endr = ActiveCell.Row で最終行を探しendrにその行番号代入してます。 For i = 4 To endr - 1   で4行目から最終行までループさせて計算をして、I・J・K列に結果を表示しているからでは?。 ※下記の部分で表示 Cells(i, 9) = Cells(i, 6) - Cells(i + 1, 6) Cells(i, 10) = 0 Cells(i, 9) = 0 Cells(i, 10) = Cells(i + 1, 6) - Cells(i, 6) Range(Cells(4, 11), Cells(endr - 6, 11)).Formula = "=AVERAGE(I4:I9)/(AVERAGE(I4:I9)+AVERAGE(J4:J9))*100"

全文を見る
すると、全ての回答が全文表示されます。
  • axsies
  • ベストアンサー率64% (38/59)
回答No.3

> Cells(i, 9) = Cells(i, 6) - Cells(i + 1, 6) > Cells(i, 10) = 0 のCells()ですね。 Cells(i, 9).Value = Cells(i, 6).Value - Cells(i + 1, 6).Value Cells(i, 10).Value = 0 が本来ですが、VBAの場合メソッドやプロパティを省略すると「特定のプロパティ」へのアクセスと解釈される仕様があるようです。 詳しくは、↓この辺のURLを参照してください。 http://officetanaka.net/excel/vba/speed/s8.htm http://okwave.jp/qa/q2680854.html

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

私も質問の意味がわからない。 前半は参考書に書いてあったのですか。 Cells(20000, 1).End(xlUp).Select endr = ActiveCell.Row これだとA列データ最終行の「セルの値」がendrに入る。 普通は(私ほか多くの他人の実例では)データ最終行の行番号をとらえて endr=Cells(20000, 1).End(xlUp).Row For i = 4 To endr '処理 Next i とする。A列最終行には何か数値データ(データ数などが入っている例か? 20000という数字を使うのも唐突だ。 For i = 4 To endr - 1とEndrの一行前で繰り返しを止めているのはなぜか。 jとja は使われていないようだが、そのあとを見て、質問に関係ない変数なら質問に載せないこと。 >なぜ、セルが埋まるのか? とはなに? >、変な質問かもしれませんが 内容が変というよりも、聞きたい内容の表現が出来てない、文章表現力の問題ではないか。 ーー >単なる代入に過ぎないかと?? 代入というのも間違いではないと思うが、関数式をVBAでセルに設定しているようだ。 突然 Cells(endr - 6, 11)). が出てきて理解できない。 VBAやプログラムは、コードだけの問題ではなく、データの有様との 関連で適否が判断で気宇もの。 質問にデータ例を挙げないで、質問するのは、この大切なことがわかっていない証拠 >Formula のヘルプでも?? 質問の式のどこがわからないのか。エクセルのワークシートの関数(VBAの関数ではない)の勉強をせよ。 >j = endr: ja = 0  ja の 宣言も ないようです。 これは>Formula のヘルプでも??と関連するのか? 変数の宣言はやるべきです。しかしVBAではやらなくても、ロジック的に誤りがなければ実行がうまくいく場合がある。 配列などはそうは行かない。 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_040.html お勧めの初期設定。 ーーーー この質問コーナーは多数の人が読むものである。 この質問コーナーにVBAの質問できるようなるには、VBAを多少勉強が済んでからにすべきだ。 文章表現も含めて、もう少し勉強してからにしては。

全文を見る
すると、全ての回答が全文表示されます。
  • anpauro11
  • ベストアンサー率28% (4/14)
回答No.1

もうちょっと何をさせてるプログラムなのか解説があると分かりやすいです。 上のFOR~NEXTのiが4から始まってる理由とか 「セルを埋める」が指してる意味とか・・・

007itochan
質問者

補足

恐縮です。 I=4 は タイトルがあるから だけです NEXTの部分は 4から セルの最後まで 埋まります。これは当然といえばそうです。 問題は Range(Cells(4, 11), Cells(endr - 6, 11)).Formula = "=AVERAGE(I4:I9)/(AVERAGE(I4:I9)+AVERAGE(J4:J9))*100" レンジとして 11(k)を 4から endr - 6 まで Formula でとっているのですが 右辺が なぜ カラムが進むのか? おそらく I4:I9 が I5:I11 と進んで 計算されているはず・ なぜなら、11(k)が 4から endr - 6 まで ことなる数値で埋まるのですから。 そんな仕掛けが どこにあるのでしょう?? j = endr: ja = 0  これが?? が質問です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 2次方程式を解くマクロを作成したのですが解けません。

    2次方程式を解くマクロを作成したのですが解けません。 マクロの授業で2次方程式を解くマクロを作成したのですが途中で何がなんだかわかんなくなってしまいました。 どこがどう間違っているのかわからない初心者なのでわかりやすい解説よろしくお願いします。 ■二次方程式の解を求めるマクロ マクロ名 niji 条件 課題のファイルのsheet1を開き、 A1にxの二乗の係数 C3にxの係数 E3に定数項 を入力した場合 判別式の結果より、I3に解の状態を表示させる 表示は 2つの異なる実根 重根 複素数根 のいずれかとする。 そして、J3、K3に二次方程式の解を表示させる。解は二次方程式の解の公式 より求める。 複素数は i としてあらわす。 以下作成したマクロ↓ Sub niji() Range("A3").Select a = ActiveCell.Formula Range("C3").Select b = ActiveCell.Formula b2 = -b / 2 Range("E3").Select c = ActiveCell.Formula d = b * b - 4 * a * c Range("J3,K3").Formula = "" 'ActiveCell.Formula = "" If d > 0 Then x1 = b2 + Sqr(d) / 2 x2 = b2 - Sqr(d) / 2 Range("J2").Select ActiveCell.Formula = "解1" Range("J3").Select ActiveCell.Formula = Str$(x1) Range("K2").Select ActiveCell.Formula = "解2" Range("K3").Select ActiveCell.Formula = Str$(x2) End If If d = 0 Then Range("J2").Select ActiveCell.Formula = "x =" Range("J3").Select ActiveCell.Formula = Str$(b2) End If If d < 0 Then d2 = Sqr(-d) / 2 Range("J2").Select ActiveCell.Formula = "x1 =" Range("J3").Select ActiveCell.Formula = Str$(b2) + " +- i " + Str$(d2) End If If "J3" = "K3" Then Range("I3").Select ActiveCell.Formula = "重解" End If If "J3" > "K3" Then Range("I3").Select ActiveCell.Formula = "2つの異なる実根" End If If "J3" < "K3" Then Range("I3").Select ActiveCell.Formula = "2つの異なる実根" End If Range("b8").Select End Sub マクロ初心者なのでわかりやすい解説お願いします。

  • シート内の特定のセルの範囲が変化した時、

    シート内の特定のセルの範囲が変化した時、 まずA列の最大値を求めて、その後A列とD列のそれぞれの条件にあった行のA列に 最大値+1を表示させるようにしたいのですが動作しません。 なぜ動かないか教えて下さい。 参考までに、そのプログラムを記載します。 宜しくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 3 Or Target.Row > 65000 And Target.Column = 4 Then Dim i, j, max As Integer max = 0 For i = 3 To Cells(Rows.Count, 1).End(xlUp).Row If max < Range("A" & i).Value Then max = Range("A" & i).Value End If Next i For j = 3 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(j, 1) = "" And Not Cells(j, 4) = "" Then Cells(j, 1) = max + 1 End If Next j End If End Sub

  • VBAのコードに関する質問です。

    以下のコードで実行しているのですが上手くデータ数のカウンタが上手くいきません。助言をお願いしたいです。 Range("D2").Select ActiveCell.Formula = "=0.001*C2+D1" Range("D2").Select Selection.AutoFill Destination:=Range("D2:D" & fin), Type:=xlFillDefault Range("D2:D" & fin).Select Dim i As Long, j As Long, flg As Boolean Dim i1 As Long j = 1 For i = 2 To Cells(Rows.count, 2).End(xlUp).Row If Cells(i, 2) = 2 Then flg = True ElseIf Cells(i, 2) = 3 And flg = True Then i1 = i Cells(1, 7) = i - 1 Cells(j, 5) = Cells(i, 4) Cells(j, 6) = Cells(i - 1, 4) flg = False Exit For Else: flg = False End If Next For i = i To Cells(Rows.count, 2).End(xlUp).Row If Cells(i, 2) = 2 Then flg = True ElseIf Cells(i, 2) = 3 And flg = True Then j = j + 1 Cells(j, 7) = i - i1 - 2 i1 = i Cells(j, 5) = Cells(i, 4) Cells(j, 6) = Cells(i - 1, 4) flg = False Else: flg = False End If Next Range("E1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Cells(1, 5) = Cells(2, 4) Cells(Rows.count, 6).End(xlUp).Offset(1).Value = _ Cells(Rows.count, 4).End(xlUp).Value Cells(Rows.count, 7).End(xlUp).Offset(1).Value = 200 Range("H1").Select ActiveCell.Formula = "=(F1-E1)/G1" Range("H1").Select Selection.AutoFill Destination:=Range("H1:H16"), Type:=xlFillDefault Range("H1:H16").Select Range("E1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("F1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("G1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("H1").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Dim rowStr As Long, rowEnd As Long Dim A, D, Da, H, K '演算:K=D-Da-H*A Dim cntS As Integer, cntA As Integer Dim cntD As Integer, cntH As Integer Dim r As Long, t As Long rowStr = 2 '開始行 rowEnd = Cells(Rows.count, 7).End(xlUp).Row 'G列で最終行を求める cntS = 1 '周期初期値 cntD = rowStr 'D列行数初期値 cntH = rowStr 'H列行数初期値 For r = rowStr To rowEnd cntA = rowStr For t = 1 To Cells(r, 7) '各周期の繰り返し処理 A = Cells(cntA, 1).Value D = Cells(cntD, 4).Value If t = 1 Then If r = rowStr Then Da = 0 '1周期目は0とする Else '2週期目以降は最初の値に固定 Da = Cells(cntD, 4).Value End If '周期の区切りをF列に出力 Cells(cntD, 11).Value = cntS & "周期" End If H = Cells(cntH, 8).Value K = D - Da - H * A '演算 Cells(cntD, 10).Value = K cntA = cntA + 1 'A列カウンタ更新 cntD = cntD + 1 'D列カウンタ更新 Next t cntS = cntS + 1 '周期カウンタ更新 cntH = cntH + 1 'H列カウンタ更新 Next r

  • フィルタでくくった状態でコピー貼り付け (2)

    以前に、http://okwave.jp/qa/q6456460.html で質問して解決したのですが 別のパターンで質問です。 以前は、L2から絶対だったのですが、今回は、セルが決まってません。 Lの1404にセルを持ってくるのに 一応 Sub 仕入先ブランク解除() Range("L1").Select Selection.End(xlDown).Select Selection.AutoFilter Field:=12, Criteria1:="=", Operator:=xlAnd Call 下に移動 ActiveCell.FormulaR1C1 = "=RC[-9]" Call 右に1マス移動 ActiveCell.FormulaR1C1 = "=RC[-9]" End Sub Sub 下に移動() ro = ActiveCell.Row co = ActiveCell.Column Range(Cells(ro + 1, co), Cells(ro + 1, co)).Select End Sub Sub 右に移動() ro = ActiveCell.Row co = ActiveCell.Column Range(Cells(ro + 1, co), Cells(ro + 1, co)).Select End Sub Sub 右に1マス移動() i = ActiveCell.Row j = ActiveCell.Column Cells(i + 0, j + 1).Select End Sub Sub メーカー名コピーあんど貼付() Dim r As Range With ActiveSheet Set r = .Range("L2", .Cells(.Rows.Count, "K").End(xlUp).Offset(, 1)) r.Item(1).Copy r If .FilterMode Then .ShowAllData End If r.Value = r.Value End With Set r = Nothing End Sub ってしました。 その後、関数のコピー貼り付けができません。(メーカー名コピーあんど貼付)の部分です わかる方がいましたらお願いします。

  • VBA シートがなかったら「シートがない」と表示

    P1セルに「テスト」の名称を付ける。 P2セルにVLOOKUP計算式を入れる。最後尾までオートフィルでコピー。 といったコードです。 Sub テスト()  Range("P1").Select     ActiveCell.FormulaR1C1 = "テスト" nLast = Cells(Rows.Count, 1).End(xlUp).Row     Range("P2:P" & nLast).Formula = "=VLOOKUP(K2,履歴!D:E,2,0)" End Sub もし「履歴」というシートがなかったら、「シートがありません」というメッセージウィンドウを」表示したいです。 https://oshiete.goo.ne.jp/qa/1043563.html を参考に Sub テスト() On Error GoTo err_handle  Range("P1").Select     ActiveCell.FormulaR1C1 = "テスト" nLast = Cells(Rows.Count, 1).End(xlUp).Row     Range("P2:P" & nLast).Formula = "=VLOOKUP(K2,履歴!D:E,2,0)" err_handle: If Err = 9 Then MsgBox "シートAAAが存在しません。" Exit Sub End If End Sub と記述しましたが、エラーメッセージは表示しませんでした。 どのように追記したら良いでしょうか? 宜しくお願いします。

  • loop終了後のセルの一個右から同様のloopを行う方法

    ・loop終了後のセルの一個右から同様のloopのプログラムを組むのが目的です。 ・データはA列にランダムに数字が入っているものとします。 ・条件式としては基準値より小さな数字が一個下のセルにあったら↓を表示して、さらに下に行くという風にして、基準よりも多くなったところでloopがストップする設定です。 ・困っているところをうまく表現できてないかも知れませんが、よろしくお願いします。 --------------------------- Sub 比較() Dim i As Integer Dim j As Integer Cells(1, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" i = 1 Do While Cells(i, 2).Value <> "" If Cells(i, 2).Value = "↓" Then Cells(1 + i, 2).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R1C1,""→"",""↓"")" End If i = i + 1 Loop Cells(i - 1, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" j = 1 Do While Cells(i - 2 + j, 3).Value <> "" If Cells(i - 2 + j, 3).Value = "↓" Then Cells(i - 1 + j, 3).Select ActiveCell.FormulaR1C1 = "=IF(RC1>R" & i - 1 & "C1,""→"",""↓"")" End If j = j + 1 Loop End Sub

  • VBAでのエラー対処について

    現在仕事でVBAと悪戦苦闘しています。 下記のマクロを実行すると、実行時エラー'13':型が一致しません。 と表示されます。 初心者で対処法がわかりません。 よろしくお願いします。 Sub Macro1() dat = InputBox("検索値") Range("A1").Activate Cells.Find(What:=dat, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _ , MatchByte:=False, SearchFormat:=False).Activate gegyo = ActiveCell Do Cells.FindNext(After:=ActiveCell).Activate If dat = ActiveCell Then If gegyo = ActiveCell.Row Then End Rows(ActiveCell.Row - 1 & ":" & ActiveCell.Row - 1).Delete Shift:=xlUp Range("A" & ActiveCell.Row - 1).Activate Rows(ActiveCell.Row + 1 & ":" & ActiveCell.Row + 1).Delete Shift:=xlUp Rows(ActiveCell.Row & ":" & ActiveCell.Row).Delete Shift:=xlUp End If gegyo = ActiveCell.Row Loop End Sub

  • Excelでwatabeさんに複数のセルを参照

    Excel2007でwatabe007さんに以前に作って頂いたこのようなソースがあります。 Sub Test4() Dim LastO As Long, LastG As Long Dim i As Long, str As String Range("D3", Cells(Rows.Count, "F").End(xlUp)).ClearContents LastO = Cells(Rows.Count, "O").End(xlUp).Row Range("A3:C3").Value = Cells(LastO, "O").Resize(, 3).Value str = Range("A3").Value & Range("B3").Value & Range("C3").Value For i = 3 To LastO   If str = Cells(i, "O").Value & Cells(i, "P").Value & Cells(i, "Q").Value Then     LastG = Cells(Rows.Count, "D").End(xlUp).Row + 1     If LastG < 3 Then LastG = 3     Cells(LastG, "D").Resize(, 3).Value = Cells(i + 1, "O").Resize(, 3).Value   End If Next End Sub これにいつも格子をつけて文字がセンターになるようにしたいですがどうすればよろしいですか?解答よろしくお願いいたします。

  • エクセルVBA 平均を可変で求めたい

    はじめましてエクセルVBA初心者です。 為替の5日移動平均線を求めたいとおもっております。 以下のようなコードを書いていますが、可変で平均を計算してくれません。※1日目の平均をずっと継承してしまいます。 どのようにすれば、これを可変にできますでしょうか。 ご教示、宜しく御願いいたします。 Const AVHI1 As Integer = 5 ~ 省略 ~ '最終セル Cells(65536, 1).End(xlUp).Select endrh = ActiveCell.Row Range("A2").Select ~ 省略 ~ 'AVHI1(5日)の終値平均 ------------------------------------------ avhi = AVHI1 + 1 Range(Cells(2, 16), Cells(endrh - AVHI1, 16)) = WorksheetFunction.Average(Range("F2:F " & avhi & "")) Range("G1").Select

  • 関数の中で参照するセル範囲(変動する)の記述方法

    セルJ5に下記の数式を入力するマクロを組みたいのですが、記述方法が分かりません。   =SUMIF(セル範囲(1),B5,セル範囲(2))  ・セル範囲(1)にはB5:C列の最終データまで  ・セル範囲(2)にはC5:C列の最終データまで 自分なりに   ActiveCell.Formula = "=SUMIF(Range(Cells(5, 2), Cells(Range("b5").End(xlDown).Row, 3)),b5,Range(Cells(5, 2), Cells(Range("C5").End(xlDown).Row, 3)))" と書いてみたのですがダメでした。 どうかご教授お願い致します。