• 締切済み

エクセルVBA セル選択範囲を調べるメソッドについ

cj_moverの回答

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

こんにちは。#1~4、cjです。 フラグ配列を使った例をあげることにしました。 応用できる機会が比較的多いと思います。 また、この方法だと、元々の行位置の順に格納できますから、 ソートする必要がありません。 また、重複の処理も簡単です。 一応、これは、元々の質問に対する答えに近いようにも思います。 Range オブジェクトのプロパティからフラグ配列を作って、 テーブル全体の値を格納した配列から フラグ配列のインデックスに対応したレコードを バッファに流し込みます。 (レコードの先頭が1行目から始まらない場合を考慮して書いていますので、その分少し長いです。) (一般的なエラー処理も加えました。) ' ' ============================================================ Sub Re7761791c5()   Dim buf()          ' 抽出レコードを流し込む配列   Dim mtxV()         ' テーブル全体の値を格納する配列   Dim Target   As Range   ' Selectionを元に、テーブルからはみ出た範囲を削いだセル範囲   Dim a     As Range   ' Area ループ用   Dim nRowOffset As Long   ' 『テーブル上の行番地』と『配列インデックス』との相対補正   Dim nYSize   As Long   ' テーブルの行サイズ   Dim nXSize   As Long   ' テーブルの列サイズ   Dim nTop    As Long   ' Area 先頭行の相対番地   Dim nBottom   As Long   ' Area 最下行の相対番地   Dim arFlg() As Boolean   ' 抽出レコードをマークするフラグ配列   Dim cnt     As Long   ' 抽出レコード数カウンタ   Dim i As Long, j As Long  ' ループ用カウンタ '  Range("G13:G14,B2:B3,E10:G13,C6:D7,F7:G7").Select ' ダミー   ' ' セル範囲以外を選択中なら、抜ける   If TypeName(Selection) <> "Range" Then Exit Sub   With Sheets("リスト")     nRowOffset = 0  ' 先頭.Row - 1     ' ' 最下行位置を取得して、行サイズを求める     nYSize = .Cells(Rows.Count, "A").End(xlUp).Row - nRowOffset     nXSize = 11  ' 列サイズ     ' ' テーブル全体を捉える     With .Cells.Resize(nYSize, nXSize).Offset(nRowOffset)       ' ' Selection について、テーブルから、はみ出た部分を削いでおく       Set Target = Application.Intersect(.Cells, Selection)       ' ' Selection がテーブル内にない場合、抜ける       If Target Is Nothing Then Exit Sub       ' ' テーブル全体の値を配列として格納しておく       mtxV() = .Value     End With   End With   ' ' フラグ配列を行サイズで定義   ReDim arFlg(1 To nYSize) As Boolean   ' ' Target 各Areaをループ   For Each a In Target.Areas     ' ' Area の先頭行位置を相対位置で求める     nTop = a.Row - nRowOffset     ' ' Area の行数を取得して、最下行位置を相対位置で求める     nBottom = nTop + a.Rows.Count - 1     ' ' Area の先頭行から最下行に対応したフラグをTrueに設定する     For i = nTop To nBottom       ' ' (他のAreaと重複している場合)既にTrueに設定してある場合は何もしない       If Not arFlg(i) Then         arFlg(i) = True         ' ' 抽出するレコード数をカウント         cnt = cnt + 1       End If     Next i   Next a   ' ' 抽出レコードを流し込む配列をレコード数と列サイズで定義   ReDim buf(1 To cnt, 1 To nXSize)   cnt = 0   ' ' フラグ配列を総なめして、Trueならbufに流し込む   For i = 1 To nYSize     If arFlg(i) Then       cnt = cnt + 1       For j = 1 To nXSize         buf(cnt, j) = mtxV(i, j)       Next j     End If   Next i ' Range("M1").Resize(cnt, nXSize).Value = buf ' ダミー   ' ' オブジェクト変数の解放   Set Target = Nothing   ' ' 配列変数の初期化 '  Erase mtxV, arFlg, buf End Sub ' ' ============================================================       応用できる場面が見つかるといいのですけれど。 以上です。

関連するQ&A

  • VBA、セルの選択範囲について

    下記のような表を用意し、   A   B  C  D  E 1    1月 2月 3月 合計 2 Aさん 1  2  3  6 3 Bさん 1  2  3  6 4 Cさん 1  2  3  6 5 合 計 3  6  9  18 セルの範囲選択を指定し別シートの任意のセルへコピーをVBAで行いたいのですが、 Aさん、Bさん、Cさんという範囲を選択する為に、合計という文字は含みたくないので、 Range("A2").Select Range(Selection, Selection.End(xlDown).Offset(-1)).Select と記載し、これは出来ました。 同様に、 1月、2月、3月という範囲も同様にxlToRightを使用し選択出来ました。 Range("B1").Select Range(Selection.End(xlToRight).Offset(, -1), Selection).Select しかし、B2:D4の範囲の指定の仕方がわかりませんでした。 データのレコード数は一定ではないのでB2:D4というように範囲を指定する事は出来ません。 そのときに応じてDさん、Eさんと増えたり、4月、5月と増えたりするので。 何か方法があればご指導お願いします。

  • 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とは行の先頭という意味ですか?? 初心者ですので分かりやすく教えてください。

  • エクセルVBAでの範囲選択について

    はじめまして。 VBAを勉強し始めたばかりなのですが、 sub test() Range("A1:M10").Select Selection.WrapText=True End Sub とあるものを、 『InputBox』を使わずに自由に範囲選択をするように するにはどういう方法があるのですか?

  • ExcelのVBAで特定のセルのみ選択

    Excel VBAの初心者です。 数式など入ったセルの選択は Selection.SpecialCells(xlFormulas).Select で、出来ましたが単純にセルの値が「1」などの時に選択するには どうすれば良いでしょうか。

  • Excel VBAで選択範囲を一括編集

    Excelで選択された範囲に入力された数値を、例えば2倍するにはどのようにすればいいのでしょうか。 Selection.Value = Selection.Value * 2 のようなやり方が知りたいです。

  • Excel VBA のセル内の選択テキストの読み書きは?

    Excel VBAで、選択されたセルではなくセル内の選択された部分のテキストの読み書きはできるのでしょうか? つまり、選択されたセルのテキストは Selection.Value を使って OldText = Selection.Value Selection.Value = "NewText" と読み書きができますが、セル内で選択されたテキストについてのインターフェイスはあるんでしょうか?

  • エクセルVBAでセル選択

    エクセル2000でリストを作成し、VBAで編集しようとしています。 A列に入力されているコードの先頭に「’」をつけて文字列とするための関数をB2のセルからA列のデータが入力されている最後のセルの隣までコピーしたいと思っています。 A列の最終セルを取得するVBAは分かったのですが、その値をB列の選択範囲として使用する方法がわかりません。 エクセルVBAは全くの初心者です。 どなたか教えてください!

  • エクセルVBAで、選択セルを常にC行にする。

    エクセルVBAで、選択セルを常にC行にする。 例:ボタンをクリックすれば、選択しているセルがN25ならC25になり、N7ならC7にしたいのです。 選択セル範囲がB2:N12ならば、一番上を有効として、C2のみを選択範囲としてほしいのです。 VBAで記述するならどのようになるか。ご教示ください。

  • EXCEL VBA 空白行を含んだ範囲選択

    EXCEL VBA超初心者です。 EXCELのVBAについての質問です。 以下のような、日ごとのお金の貸付、返済の一覧データがあります。 例 A B C D E 1 年  月 日 貸付  返済 2 2008 5 10 10000 3 2008 6 10      8000 4 2008 7 10 20000 5 2008 8 20      7000 ・データの行数は決まっていません。 ・最後の行が「貸付」で終わることもありますし 例のように「入金」で終わることもあります。 ・各データには必ず「年」「月」「日」が入力してあります。 VBAで、A2セルからE5セルを範囲選択するには どのように記述したらいいですか? ちなみに自分で色々と調べてみて Selection.SpecialCells(xlCellTypeConstants, 23).Select としたのですが それだと空白セル(例でいうとE2やD3セル)が選択されず とびとびになってしまいました。 ご教授お願いいたします!

  • セルの範囲選択

    エクセルVBAの質問です。 セルの範囲選択をしたくて色々と試してみたのですが、どうも上手くいかないので教えてください。 「Range("F25:F36")」とした時の「F36」が可変の場合はどうすれば良いのでしょうか? よろしくお願いします。