ExcelVBAの変数設定とセルデータの取得方法について

このQ&Aのポイント
  • ExcelVBAで変数を設定し、セルデータを取得する方法についてご教授ください。
  • 変数1には現在選択中の行の1列目のセルデータを代入し、変数2には現在選択中の行の4列目のセルデータを代入します。
  • 変数3はA11:A24の範囲から、変数1に該当するセルの行を取得するものです。Cells(変数2, 1)は変数2の値に基づいてA列の行を指定しています。追加するかどうかは変数3の結果によります。
回答を見る
  • ベストアンサー

excelvbaについてご教授ください。

いつもお世話になっております。 excelvbaの変数設定について、早速質問です。 A1を選択中だとして、 変数1 = Cells(Selection.Row, 1).Value は、(現在選択中の行,1列目)のセルデータを変数1に代入している。 変数2 = Cells(Selection.Row, 4).Value は、(現在選択中の行,4列目)のセルデータを変数2に代入している。 ということでそれぞれ間違いないでしょうか? 上記が正しいとして、 変数3 = Range("A11:A24 ").Find(What:=変数1, LookAt:=xlPart).Cells(変数2, 1).Row は、A11:A24から、変数1に該当するセルの行を変数3に代入しているということでしょうか? 特に、Cells(変数2, 1)の部分がよくわからないのですが、これ単体で見るとA4ですが、追加してもしなくても、結局変数3は変数1に該当する行なので、追加する必要があるのでしょうか? 的を得ていない質問をしていましたら申し訳ございません。

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

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

変数1には、アクティブセルの行のA列のセルの「値」が入ります 変数2には、アクティブセルの行のD列のセルの値が入ります このD列には、数字が記入されていなければなりません 一応ご質問のマクロが正しいとして変数3を順序よく追ってみると 1.A11:A24の範囲を対象に 2.変数1に格納した値を部分一致で検索し 3.ヒットしたセルを基準として(=A1セルとみなして)cells(変数2,1)の位置にあるセル 4.の行番号 を求めています。 仮に変数1に該当する値がA15セルにあったとして 変数2に4が入っていたとすると A15をA1とみなしてA4の位置に来るのはA18セルですから 変数3には18が入ります。 ホントにそんな事をしなきゃならないデータ構造になっている(=確かにマクロは正しい)のか、それとも実は間違ったマクロでトンデモをやらかしているのかは、こちらでは判りませんけどね。

noritama12
質問者

お礼

回答ありがとうございます! 説明してもらい理解することができました。

関連するQ&A

  • Excel VBA セル位置が取得できません

    条件1の時、セル位置を変数(gyo1)に代入し、 条件2の時、セル位置を変数(gyo2)に代入。 その後、countif(gyo1:gyo2)として、 その数値を別のセルに表示させる。 という構文を作りたいと思っています。 しかし、adressプロパティを記述しても、「オブジェクトが必要です」とエラーが出てしまいます。 (expressionをSelectionに変えるとエラーは出ないのですが、この違いや意味ってなんでしょうか。) さらに、この構文はFor文で繰り返しているのですが、 最初にgyo1の値が「A2」となっても、次の繰り返し時、条件が一致したても、gyo1が更新されず、「A2」のままだったりします。 (イメージでは、「A10」とか、A列を下に移動していくはずです。) また、gyo1,gyo2の変数宣言は、どのようにすれば良いでしょうか。 以下、作成中のコードを記述します。 力を貸してくださいませ。よろしくお願いいたします。 row = 2 If Cells(row, 1) <> Cells(row - 1, 1) Then gyo1= Selection.Address(Cells(row, 1)) End If If Cells(row, 2) <> Cells(row - 1, 2) Then gyo2 = Selection.Address(Cells(row, 2)) End If Cells(row,5).value = countif(gyo1:gyo2)

  • ExcelVBA 選択された列のセルを指定する

    簡単かなと思ったら意外と出来ず、調べても出てこなくて思わぬ苦戦を強いられてしまい、 質問させて頂きます。 列をまるごと選択している状態で、その選択している列のセルを指定するには どうしたらいいでしょうか? とりあえず目的としてはシート1のA列を選択した状態で、 列の先頭(A1)の値をシート2に移す事としております。 以下、エラーになってしまったコードです 列選択でOffsetを使用した為のエラー? Worksheets("sheet2").Cells(1,1).Value = Worksheets("sheet1").Columns(1).Offset(0, 0).Value 選択してない状態でSelectionを使用した為のエラー? Worksheets("sheet2").Cells(1,1).Value = Worksheets("sheet1").Columns(1).Selection(1).Value 上手く動いたコード Application.Goto Worksheets("sheet1").Columns(1) Worksheets("sheet2").Cells(1,1).Value = Selection(1).Value Application.Goto でシート1のA列を指定してからSelectionで一つ目のセルを指定すれば出来ました しかし、大量のデータを扱う時にいちいち範囲選択していたら処理が遅くなると思われますし、 コード自体もスッキリしないのでいまいち納得がいきません。 1行で「Worksheets("sheet1").Columns(1).●●●」と続くメソッドの様な、スッキリできる方法は 無いのでしょうか? どなたかご教授お願いいたします。 当方Excel2003を使用しております。 宜しくお願い致します。

  • エクセル マクロ:部分一致検索

    教えてください。 sheet1のA列に時間データがあります。A列は書式設定でhh:mm:ss.00にしています。 sheet2のA1に時間を表示しており書式設定でhh:mm:ssにしています。 sheet2のA1と部分一致する時間を、sheet1のA列から検索するマクロを作成しています。 (複数ある場合は初めに該当するセルの行を表示) sheet2に下記のコードを入力しており、実行すると「オブジェクト変数またはwithブロック変数がされていません」と表示され困っています。 ご教授のほどよろしくお願い致します。 Sub 検索() Dim Jikan As Date Dim Row1 As Integer Jikan = Sheets("sheet2").Cells(1, 1).Value Row1 = Sheets("sheet1").Range("A:A"). _ Find(What:=Jikan, LookAt:=xlPart).Row MsgBox Row1 End Sub

  • エクセルVBAで、非表示にした行は飛ばしてスクロールさせる方法を教えて

    エクセルVBAで、非表示にした行は飛ばしてスクロールさせる方法を教えて下さい。 下記の画像のようなエクセルの表があったとします。 A2セルに設置した「下へ」ボタンを押す度に、(ウィンドウ枠の固定をA2セルの下でやっているので)現在のA3セルがある場所に、最初にA17セル、次にA28セル、と、各会社の一番上の行が来るようなマクロを作りたいと思いました。 ただし、もう取引のない会社等の理由で、非表示にしてある会社は飛ばしてスクロールさせたいのえすが、飛ばすことが出来ません。 画像で説明しますと、A社が一番上に表示してある状態で、「下へ」ボタンを1回押すと、C社が一番上に来るようにしたいのですがうまくいきません。 どうしたらよいのでしょうか? Sub 下スクロール() s = Selection.Row '現在選択されているセルの行番号をs変数として表現 Cells(s, 1).Select '選択されているセルのA列を選択(A列以外の列が選択されていた時の為) au = Selection.Row '選択されている結合セルの一番上の行番号をau変数と表現 'ad3 = Selection.Offset(3, 0).Row 'ad3 = Cells(au + Range("A" & au).MergeArea.Count - 1, 1).Offset(3, 0).Row ad3 = Cells(au + Range("A" & au).MergeArea.Count - 1, 1).Row + 3 '結合セルの一番下の行から3行下の行をad3変数で表現 ActiveWindow.ScrollRow = ad3 'ad3行が一番上に来るようスクロール Cells(ad3, 1).Select 'A列を選択 End Sub よろしくお願い致します。

  • エクセル VBA find は別シートを検索できますでしょうか?

    こんばんわ。マクロ初心者です。 皆さんいつも親切なご回答ありがとうございます。 早速ですが質問内容を記入いたします。 ・ブックA を開いています。 選択している行のC列セルの値を検索キーワードにして、 ブックB 内を検索し、検索結果のセルの3つ左のセルの値を、 ブックA で選択していたセルの同じ行のO列(15列目)に入力したいです。 ※ブックBをアクティベートする事無く行えますでしょうか? (他の処理と組合わせて行い、回数も多いので、  ブックA⇔ブックB アクティベートの往復は避けたいです。) 下のようなマクロを作成してみましたがうまくいきません。 どうかご指導よろしくお願いいたします。 --------------------------------------------------------------- dim 検索品目 as string dim fcell as object dim i as integer i = Selection.Row '選択行の3列目セルの値を変数『検索品目』に格納 検索品目 = Cells(i, 3).Value 'オブジェクト変数『fcell』に検索したセルを格納 Set fcell = Cells.Find(What:=検索品目, After:=Workbooks("ブックB.xls").Worksheets("sheet1").Range("G2"), LookAt:=xlWhole, searchorder:=xlByColumns) '検索したセルの3行左のセルの値を変数『オーダ番号』に格納 オーダ番号 = fcell.Offset(, -3).Value 'ブック A の選択行の15列(O列)にデータ入力 Cells(i, 15) = オーダ番号

  • VBA_選択セル範囲の最小値を求めるプロシージャ。教えてください。

    EXCELVBAの参考書を読んでいて分からないところがあります。 以下は参考書に書いてある内容。 『 1:Sub Position() 2: '選択セル範囲の位置を代入するための変数を宣言する 3: Dim R1 As Long, R2 As Long, C1 As Long, C2 As Long 4: '選択セル範囲の左上の行番号/列番号を求める 5: R1 = Selection.Row 6: C1 = Selection.Column 7: '選択セル範囲の右下の行番号/列番号を求める 8: R2 = Selection.Row + Selection.Row.Count - 1 9: C2 = Selecton.Columns + Selecton.Columns.Count - 1 10: '選択セル範囲の1行下に、各列の最小値を求めるMIN関数の式を代入する 11: Range(Cells(R2 + 1, C1),Cells(R2 + 1,C2)).FormulaR1C1 = "MIN(R" & R1 & "C:R" & R2 "C)" 』 と書いてあり 11行目の説明は、 『"MIN(R" & R1 & "C:R" & R2 "C)" は、「MIN(R」 & R1 & 「C:R」 & R2 「C)」になり、最終的にセルに置きたい式は次のような式です。式の中の「□」と「○」は、変数R1とR2の値、つまり選択セル範囲の上端/下端の行番号です。 =MIN(R□:CR○C) 』とあります。 なぜ=MIN(R□:CR○C)になるのでしょうか?? CRとは行の先頭という意味ですか?? 初心者ですので分かりやすく教えてください。

  • ExcelVBA エラー処理で2回目の同一エラーは

    こんにちは。 EcxelVBA初心者です。 セルD8~D10の値をCP44~CP100の値と比較し、一致したら8~10行目のそれぞれのセルに記入する際、 CP44~CP100に一致しない場合(エラー91)、エラー処理でメッセージを表示し、次の比較に進みたくてGOTOを使用していますが、 一度目のエラーはできるのに、二度目のエラーでは「実行時エラー91」が表示されてしまいます。 なぜ、一度目と同じようにエラー処理でメッセージ表示、次の比較に勧めないのでしょうか? よろしくお願いします。 Sub test() Dim i As Integer Dim lng As Long i = 8 lng = 10 On Error GoTo D_Error i = 8 Cells(i, "D").Value = StrConv(Cells(i, "D").Value, vbUpperCase) '半角小文字は半角大文字に修正 strType = Cells(i, "D").Value For i = 8 To lng Cells(i, "D").Value = Trim(StrConv(Cells(i, "D").Value, vbUpperCase)) '半角小文字は半角大文字に修正し、余分なスペースも取る strType = Cells(i, "D").Value If Len(Trim(Cells(i, "D").Value)) = 0 Then ' D列のデータがなければ次の行へ GoTo BBB End If intStr = 0 Cells(i, "D").Select strType = Cells(i, "D").Value intStr = InStr(strType, "-") 'ハイフンの位置で調べる If intStr = 0 Then 'ハイフンがなければ、あいまい検索で文字列を探す Set rngTarget = Range("CP44:CP100").Find(What:=strType, lookat:=xlPart) intTarget = rngTarget.Row Cells(i, "AE").Value = Cells(intTarget, "CR").Value Cells(i, "AF").Value = Cells(intTarget, "CS").Value Cells(i, "AG").Value = Cells(intTarget, "CT").Value Else 'ハイフンがあれば、「(」カッコの有無を調べてから、「-」前の文字を完全一致で探す If Mid(strType, intStr - 1, 2) = "(-" Then strType = Left(strType, intStr - 1 - 1) Else strType = Left(strType, intStr - 1) End If Set rngTarget = Range("CP44:CP100").Find(What:=strType, lookat:=xlWhole) intTarget = rngTarget.Row Cells(i, "AE").Value = Cells(intTarget, "CR").Value Cells(i, "AF").Value = Cells(intTarget, "CS").Value Cells(i, "AG").Value = Cells(intTarget, "CT").Value End If BBB: Next i D_Error: If Err.Number = 91 Then If i > lng Then GoTo AAA End If MsgBox "CP列に該当する型式がありません。" & Chr(13) _ & Chr(13) _ & "  型式があるものには「-」を使用してください。" & Chr(13) _ & " それ以外はCP44~CP100にデータを入力してください。" ActiveSheet.Cells(i, "D").Interior.ColorIndex = 3 GoTo BBB Else GoTo AAA End If AAA: 'D8から下にデータがない場合 Set rngTarget = Range("CP44:CP100").Find(What:=strType, lookat:=xlPart) '完全一致の解除 Range("D8").Select End Sub

  • excelVBAのオートシェイプ幅設定について

    いつもお世話になっております。 以前こちらでお教えしてもったVBAを試してみたのですが、うまくいきません。 自分なりに調べてきたつもりですが、オートシェイプの幅を時間と結びつけるやり方がよくわかりません。 A2=14:30 A3=15:15 A4=45      B  C  D … 3行目 0   1  2  … で、4行目に、A2~A3のオートシェイプを時間の列と対応するよう作成したいのですが、幅が長くなりすぎてしまいます。 Columns("A:Z").ColumnWidth = 9 変数S = Cells(4, 2) 変数E = Cells(4, 25) ★変数Width = 変数E.Left + 変数E.Width - 変数S.Left 変数Height = 変数E.Height 変数Top = 変数S.Top ★変数Min = 変数Width / 1440 ★変数Start = Cells(1, 2).Value * 1440 * 変数Min + 変数S.Left 変数End = Cells(1, 3).Value * 24 ★変数2Width = Cells(1, 4).Value * 変数Width ActiveSheet.Shapes.AddShape(msoShapeRectangle, 変数Start, 変数Top, 変数2Width, 変数Height).Select となっていますが、 ★部分がよくわかりません。 変数Width = 変数E.Left + 変数E.Width - 変数S.Left を求めて、なぜ、A4に*ことになるのか。 1440はどこからきた数字なのか。 そもそもこの式自体が間違っているのでしょうか。 トンチンカンな質問になっていたら申し訳ございません。 よろしくお願いします。

  • マクロで指定したセル内の改行を削除

    エクセル2013です。 既に動いているマクロに別な処理を追加したいです。 まずその追加したい処理だけの単独のコードを 作成し、正しく動いたら 今使用しているマクロの最初に組込たいです。 内容はシート内において、指定した複数のセルの中の すべての改行を削除です。 マクロでなくてもできますが、上記理由でマクロで行いたいです。 ・質問1 Sub 実験() 最終行 = Cells(Rows.Count, 6).End(xlUp).Row 'F列の最終行を求める Range(Cells(4, 1), Cells(最終行, 6)).Value = Replace(Range(Cells(4, 1), Cells(最終行, 6)).Value, vbLf, "") End Sub これですと 「型が一致しません」でERRです。 これは何処が悪いのでしょうか? ・質問2 Sub 改行削除() Dim 対象範囲 As Range 最終行 = Cells(Rows.Count, 6).End(xlUp).Row 'F列の最終行を求める   Set 対象範囲 = Range(Cells(4, 1), Cells(最終行, 6)) 対象範囲.Replace vbLf, "", xlPart End Sub ↑これなら正しく動きました。 でこれを、今動いているマクロの先頭に入れたら 対象範囲.Replace vbLf, "", xlPart ↑ ここで「型が一致しません」でERRです。 なぜ単独では動作するのに、別のマクロの先頭に組み込むとERRに なるのかわかりません。 よろしくお願いします。

  • 【Excel VBA】日付の代入

    現在以下の操作を行いたく、コードを作成しています。 ・20~23行で各最大値を抽出し、C列に代入する ・最大値に紐づく日付をD列に代入する ・D列の日付が入ったセルを改行し、 2行目に"(曜日)"を入力する <現在のExcelデータ詳細> A20:"処理1" A21:"処理2" A22:"処理3" A23:"処理4" B19~AF19:日付 B20~AF23:任意の数字 C31:処理1の最大値 C33:処理2の最大値 C35:処理3の最大値 C37:処理4の最大値 D31、D33、D35、D37:日付 L(曜日)を入力予定 最大値に紐づく日付をD列に代入するところで 躓いています。 ご教示いただけないでしょうか。 現在のコードは下記の通りです。 Sub 最大値の取得() Dim max As Long Dim row As Integer Dim column As Integer For row = 20 To 23 max = 0 For column = 2 To 32 If Cells(row, column).Value > max Then max = Cells(row, column).Value End If Next Cells((row - 20) * 2 + 31, 3).Value = max For i = 4 To 1 Step -4 '編集中 Cells((row - 20) * 2 + 31, 4).Value = Cells(row - i, column - 1) '編集中 Next End Sub

専門家に質問してみよう