• 締切済み

エクセルで数値が入力されているセルのアドレス取得

エクセルである範囲の中から、数値が入力されているセルのアドレスもしくは範囲を取得したいです。      A列  B列  C列  D列  E列・・・ 1行目  20   10    2行目       11        15   10   3行目                25   30  範囲指定 A1:E3 結果 A1,B1,B2,D2,D3,E2,E3     もしくはA1:B2,D2:E3 という結果がでるとうれしいです。よろしくお願いします。

みんなの回答

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

エクセルでは、したいことを達成する方法として (1)操作 (2)関数 (3)VBA (4)アドインやソフト(他の熟練者が作ったまとまった目的のプログラム) があることをいつも思い起こしてください。(3)は経験が必要です。質問者のスキルで左右される面が大きい。 質問にはある程度の質問者の経験を書いておくほうが、回答者が目安に出来て良い。 本件は、書いてないのでどの程度かわかりません。 >セルのアドレスもしくは範囲を取得したいです 「取得」なんて難しいことを言っているが、どうしようというのか。 ーー エクセル操作の例だが 例データ A2:E4 -は空白セル a ー 12 45 ー b aa ー ー 2 c 1 ー 3 f B2:E4を範囲指定 編集ージャンプーセル選択ー定数ーOK 12,45,2,1,3のセル刷毛セル選択される。 こういうエクセルの操作を知っていると有利です。 VBAでもマクロの記録で、結果は1行のコードで済みます。 ーー マクロの記録では Sub Macro4() Selection.SpecialCells(xlCellTypeConstants, 1).Select End Sub ーー これを番地形式でセルに出すなら Sub Macro4b() k = 1 Range("B2:E4").SpecialCells(xlCellTypeConstants, 1).Select For Each cl In Selection Cells(k, "M") = cl.Address k = k + 1 Next End Sub ーーー 結果 M列に $C$2 $D$2 $E$3 $B$4 $D$4 ーー ただし数式の結果で数値になっているものは拾われない。 改良して Sub Macro4b() k = 1 Range("B2:E4").SpecialCells(xlCellTypeConstants, 1).Select For Each cl In Selection Cells(k, "M") = cl.Address k = k + 1 Next Range("B2:E4").SpecialCells(xlCellTypeFormulas, 1).Select For Each cl In Selection Cells(k, "M") = cl.Address k = k + 1 Next End Sub ーー やさしいのはFor Each cl In Range("B2:E4")で全セルチェックする方法です。 Sub Macro4c() k = 1 For Each cl In Range("B2:E4") If IsNumeric(cl) = True Then Cells(k, "L") = cl.Address k = k + 1 End If Next End Sub >という結果がでるとうれしいです 番地を出しても、あと何に使うのかな。 次に控えてる問題がむつかしいのでは。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.6

No.3・4です。 >数値が入力されているセルが多すぎると、アドレスを表示しきれなくなってしまいます。 >数値があるセルを範囲でも出せるようにしたいです とありますが「表示しきれない」ということはかなりのセル数になると思います。 その場合、単にセル番地を羅列しても判りづらいものになるはずです。 すでにお分かりかと思いますが、 仮に A1:B3 のような表示方法はA1~B3すべてのセルになりますので、A2セルなど途中が空白の場合は好ましくない表示です。 そこで苦肉の策ですが、Sheet1の範囲指定したセル番地をSheet2に各列ごとに表示してみてはどうでしょうか? そのコードの一例です。 前回同様、Sheet1を範囲指定し↓のコードでマクロを試してみてください。 Sub test() Dim i, j As Long Dim str As String Dim ws As Worksheet Set ws = Worksheets("sheet2") If WorksheetFunction.CountA(Selection) Then ws.Cells.Clear For j = Selection(1).Column To Selection(Selection.Count).Column For i = Selection(1).Row To Selection(Selection.Count).Row If Cells(i, j) <> "" Then ws.Cells(1, j) = ws.Cells(1, j).Address ws.Cells(Rows.Count, j).End(xlUp).Offset(1) = _ WorksheetFunction.Substitute(Cells(i, j).Address, "$", "") End If Next i Next j For j = ws.Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1 If ws.Cells(1, j) = "" Then ws.Columns(j).Delete End If Next j For j = 1 To ws.Cells(1, Columns.Count).End(xlToLeft).Column For i = 1 To Len(ws.Cells(1, j)) str = Mid(ws.Cells(1, j), i, 1) If Not str Like "[A-Z]" Then ws.Cells(1, j) = Replace(ws.Cells(1, j), str, "") End If Next i With ws.Cells(1, j) .Value = ws.Cells(1, j) & "列" .Interior.ColorIndex = 36 End With Next j Else MsgBox "範囲内に入力セルはありません。" End If End Sub この程度しか思いつきませんが、 ご希望の方法でなければごめんなさいね。m(_ _)m

goo001_0021
質問者

お礼

ご回答ありがとうございます。 また、大変ご面倒をお掛けしました。 助かりました。頂いたVBAをまた、 試してみたいと思います。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 今仮に、元の範囲がSheet1!A1:E3であるものとします。  又、適当な空きシート(例えばSheet2)を作業用のシートとして使用するものとします。  まず、Sheet2!A1セルに次の関数を入力して下さい。 =IF(Sheet1!A1="","",COLUMN(Sheet1!A1)*1000000+ROW(Sheet1!A1))  次に、Sheet2!A1セルをコピーして、Sheet2!A1:E3の範囲に貼り付けて下さい。  次に、Sheet1!A1セルに次の関数を入力して下さい。 =IF(COLUMNS($G:G)>COUNT(Sheet2!$A$1:$E$3),"",SUBSTITUTE(CELL("address",INDIRECT("R"&MOD(SMALL(Sheet2!$A$1:$E$3,COLUMNS($G:G)),1000000)&"C"&INT(SMALL(Sheet2!$A$1:$E$3,COLUMNS($G:G))/1000000),FALSE)),"$",))  次に、Sheet1!A1セルをコピーして、Sheet1!A1よりも右にあるセル範囲に貼り付けて下さい。  以上です。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.3です。 投稿後に気づいたのですが・・・ >結果 A1,B1,B2,D2,D3,E2,E3 のように各列を上からの表示がご希望ですよね! 前回のコードでは1行目から列方向に検索していますので、ご希望の表示ではないと思います。 ↓のコードに変更してマクロを実行してみてください。 Sub test2() Dim i, j As Long Dim str As String If WorksheetFunction.CountA(Selection) > 0 Then For j = Selection(1).Column To Selection(Selection.Count).Column For i = Selection(1).Row To Selection(Selection.Count).Row If Cells(i, j) <> "" Then str = str & WorksheetFunction.Substitute(Cells(i, j).Address, "$", "") & ", " End If Next i Next j MsgBox "入力セルは、" & vbCrLf & Left(str, Len(str) - 2) & vbCrLf & "です。" Else MsgBox "範囲内に入力セルはありません。" End If End Sub 何度も失礼しました。m(_ _)m

goo001_0021
質問者

お礼

さっそくの回答ありがとうございます。投稿していただいたVBAで、自分がやりたいと思っていた結果がでました。 ありがとうございます。 ですが、もう少しだけ、お聞きしたいことがあります。かなりデータ数が多いものにも適用できるようにするにはどうしたらよいでしょうか? 数値が入力されているセルが多すぎると、アドレスを表示しきれなくなってしまいます。数値があるセルを範囲でも出せるようにしたいです。 わがままを言って申し訳ありません。どうぞよろしくお願いします。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんにちは! VBAでの一例です。 画面左下にある操作したいSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim c As Range Dim str As String If WorksheetFunction.CountA(Selection) > 0 Then For Each c In Selection If c <> "" Then str = str & WorksheetFunction.Substitute(c.Address, "$", "") & ", " End If Next c MsgBox "入力セルは、" & Left(str, Len(str) - 1) & "です" Else MsgBox "範囲内に入力セルはありません。" End If End Sub 'この行まで ※ 検索したいセルを範囲指定して、マクロを実行します。 こんなんではどうでしょうか?m(_ _)m

  • MASUKUBO
  • ベストアンサー率22% (4/18)
回答No.2

回答No1です。 L2への入力の式は次の式がベターでしょう。 =IF(ISERROR(INDEX(INDIRECT($N$1):INDIRECT($O$1),MOD(ROW(A1)-1,ROW(INDIRECT($O$1)))+1,ROUNDUP(ROW(A1)/ROW(INDIRECT($O$1)),0))),"",IF(INDEX(INDIRECT($N$1):INDIRECT($O$1),MOD(ROW(A1)-1,ROW(INDIRECT($O$1)))+1,ROUNDUP(ROW(A1)/ROW(INDIRECT($O$1)),0))>0,CELL("address",INDEX(INDIRECT($N$1):INDIRECT($O$1),MOD(ROW(A1)-1,ROW(INDIRECT($O$1)))+1,ROUNDUP(ROW(A1)/ROW(INDIRECT($O$1)),0))),""))

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

式が複雑になりますが次のようにします。 例えばN1セルに指定範囲のA1を、O1セルに指定範囲のE3とそれぞれ文字列を入力します。 そこで作業列としてL2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(ISERROR(INDEX(INDIRECT($N$1):INDIRECT($O$1),ROUNDUP(ROW(A1)/COLUMN(INDIRECT($O$1)),0),MOD(ROW(A1)-1,COLUMN(INDIRECT($O$1)))+1)),"",IF(INDEX(INDIRECT($N$1):INDIRECT($O$1),ROUNDUP(ROW(A1)/COLUMN(INDIRECT($O$1)),0),MOD(ROW(A1)-1,COLUMN(INDIRECT($O$1)))+1)>0,CELL("address",INDEX(INDIRECT($N$1):INDIRECT($O$1),ROUNDUP(ROW(A1)/COLUMN(INDIRECT($O$1)),0),MOD(ROW(A1)-1,COLUMN(INDIRECT($O$1)))+1)),"")) M2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(L2="","",MAX(O$1:O1)+1) お求めのセルのアドレスはN2セルより下方に表示させるとしてN2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(ROW(A1)>MAX(M:M),"",SUBSTITUTE(INDEX(L:L,MATCH(ROW(A1),M:M,0)),"$",""))

関連するQ&A

  • エクセルで離れたセルを離れた場所へコピペするには?

    エクセルで 1行目のctrl+コピーで離れたセル(B1,D1,F1)を 3行目(B3,D3,F3)、4行目(B4,D4,F4)、6行目(B6,D6,F6)などに 貼り付けるにはどうすればよいでしょうか? ちなみに、A列、C列、E列には他の数値があるのでコピーしたくないのです。 どなたかよろしくお願いします。

  • Excelでセルの英字を取得する関数

    Excelでセルの英字を取得する関数を教えて下さい。  A B C D E F G 1 2 3 4 5 6 7 エクセルは 横のヘッダにアルファベットが並んでいます。 縦のヘッダに数値が並んでいます。 縦のヘッダは =ROW() で求まります。 1行目で書けば1 5行目で書けば5 と返ってきます。 同じ様に、 =COLUMN()は A列で書けば1 E列で書けば5 と返ってきます。 A列で書けばA E列で書けばE と返って来る関数が欲しいです。

  • エクセルVBAについてお尋ね致します。数式が入力されたセルを異なるセル

    エクセルVBAについてお尋ね致します。数式が入力されたセルを異なるセルの条件によって「値」のみ残す方法を模索しております。 使用する列および行の例 列=A、B  行=5~10、15~20、25~30(A列、B列共通) 上記対象セルの内訳 A列(参照セル)=数値 ※空欄の場合もあります B列(変更セル)=数式(Aセル数値 * ○○%) ※B1セルの例:=IF(A1="","",A1*10%) のような数式が記入されております。 (例) Private Sub CommandButton1_Click() ’参照セルの指定 ("A5:A10","A15:A20","A25:A30") のようなコード*** ※現在はAセルの範囲としておりますが、後に変更の可能性を有しますので範囲指定が可能な形式を望みます。 ’変更セルの指定 セル指定のコード*** ※現在はBセルとしておりますが、これも後に変更の可能性を有しますのでA・B・Cのような入力(もしくはA=1、B=2、C=3)による指定可能な形式を望みます。 ’参照セル(Aセル)に数値が入力されている場合、数式から得られた変更セル(Bセル)の値を”値のみ”で残す。 実行コード*** ※参照セル(Aセル)が空欄の場合は変更を望まないので、変更セル(Bセル)は何も致しません。(数式のまま残す) End Sub このようなマクロを望んでおります。 イメージとしては数値がAセルに入力されていた際に同じ行のBセルにおいて右クリックコマンド内〔コピー〕 → 〔形式を選択して貼り付け〕 → 〔値〕の貼り付けを行うことをご想像下さい。 列や行の変更が予想されるので変更が可能なことを望んでおりますが、結果が伴えば他の体裁は気に致しません。 お手数ですがご教授宜しくお願い致します。 以上

  • エクセルで行から数値を検索し、検索した数値のある列

    エクセルで行から数値を検索し、検索した数値のある列から左側の全ての合計を求めたいです。   A B C D E F 1  3 4 8 9 11 22 ←数字は隙間なくあるが、値がバラバラ(ただし昇順) 2 3  2~6行には色々な数字がまばらにある 4 5 6 1行目から検索したい数→10(別のセルで数式結果として出た数) ズレてるかもしれませんが・・・ E1セルに書かれている「11」の数字より前のD列、 A~D列の2行目~6行目の合計を各行ごとに別々に出していきたいです、どうしたらいいでしょうか また、表は行も列もデータを追加していく予定です

  • excelのセル参照

    vba初心者です。 excelのvbaでセル範囲(rangeなど)を指定して数値の入力や参照をしますが vbaを使わずに元のワークシート側で行・列の挿入、削除した場合 vbaにはその分反映されません。(当然ですが) Range("C3:D4")の場合、B列に列を挿入したらRange("D3:E4") となるような。 vbaの修正を最小限に抑える簡単で良い方法はありますか。

  • エクセルで入力した数値によって自動で入力される数式?

    エクセルで台帳を作っているのですが、 別の列のセルに入力した数値によって、 指定したセルに自動でA,B,C等と入力されるようにするにはどのように設定すればいいのでしょうか。 A列に0~1.1なら B列に A 1.2~2.9なら B 3.0以上なら C のように数字の範囲によってABCと表示されるようにしたいのです。 エクセルの数式等は簡単なものしかわからず、どのように調べたらよいかもわかりません。教えていただけたら助かります。

  • エクセルで数値と文字が入ったセルからの数値の抽出

    皆さんこんにちは。 エクセルの使い方についての質問です。 添付画像の例のようにA列に 「XXYYYZZ(XとZは文字、Yは数値で3桁または4桁)」というフォーマットで 数値と文字が入っているセルがあります。 同様にB列には「WWZ(Wは数値)」というフォーマットで、 同様に数値と文字が入っているセルが並んでいます。 これらからDやE列にあるように数値のみを取り出すためには DやE列にどのような関数を入れてやればよいのでしょうか。 どなたか教えていただければ幸いです。 よろしくお願いします。

  • ある数値以上の値があるセルを取得したい

    エクセルの関数で、ある数値以上の値があるセルの位置を取得したいのです。 範囲B2:B11に任意の数値が入っているものとします。 その中で、仮に3以上の値が出現するセルの位置を取得する場合、どのような関数を用いればよろしいでしょうか? 数値をぴったり3に限定なら、=MATCH(3,B2:B11,0) で、範囲内で何番目にあるかわかりますが、3以上となると 補助列を用意し、=B2>3のような式を各セルに入れて、TRUEの位置を=MATCH(TRUE,A2:A11,0) で取得するくらいしか思いつきません。 ご教示ください。

  • エクセル2010で二つのセルを一つにまとめる関数

    エクセル2010を使っています。 二つのセルに入っているそれぞれの数値を、1つのセルに文字のようにまとめたいです。 例えば、 B2に3、C2に4、なら、D2に34、です。 ただ、 B3に数値が入っていて(例えば5)、C3が空白なら、D3は、B3の数値(5) としたいです。 これらの条件を満たす、D列にいれる関数を教えてください。 どうぞよろしくお願いします。

  • エクセル関数の範囲指定を、座標数値で指定したい

    address関数とindirect関数で、行・列を数値で指定して、セルの値が求められますが、同じように行・列の数値を4つ使って範囲の指定をしたいのですが、どのような関数を使えばよいでしょうか? 具体的には、=MATCH(A1,範囲,1)の範囲を、2組の座標の数値で指定したいのです。

専門家に質問してみよう