Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2010)
セル番地を表示・印刷する方法はありませんか?
投稿日時: 19/10/16 11:47:21
投稿者: m024240

VBAの掲示板か?、一般の掲示板か?どちらにすればよいのか迷ったのですが、
よろしくおねがいします。
 
VBAのコードを作成したり、関数を設定したりするときに
セルの番地を指定することが多くあり、書式を紙に(行列番号付きで)印刷して、
セル番地を手書きして、確認しながらおこなっていますが、
何らかの方法で、セル番地を各セルに表示する(印刷する)方法ってないのでしょうか?
 
分けのわからない質問かもしれませんが、よろしくお願いします。

回答
投稿日時: 19/10/16 12:29:10
投稿者: 半平太

既にその範囲にデータが入っているんですよね?
 
ちょっと具体的イメージが涌かないので、狭い範囲でいいので、
セルの表示がどうなればいいのか示して貰えませんか?
 

<現状図>
 行  _____A_____  ______B______  __C__
  1  日付         項目           金額 
  2  2019/10/16   ブルドーザー   2,500百万円 

<希望図>
 行  _____A_____  ______B______  __C__
  1    ?      ?     ?
  2    ?      ?     ?

回答
投稿日時: 19/10/16 12:43:15
投稿者: めんたん

たとえば値をすべて消していいなら
 
Sub 選択範囲にアドレスを書き込む()
  Dim r As Range
  For Each r In Selection
     r.Value = r.Address(0,0)
  Next
End Sub
 
なんてことも(複数エリアまで考えた例ではないです)
消したくないならコメントでも設置するかな?
 
あとはエクセル本体とVBEを半分半分で左右にならべるとか、モニターをつ用意して、シート表示とVBEを分けるとかしてアドレスを確認しやすくするくらいですかね?

投稿日時: 19/10/16 12:50:36
投稿者: m024240

半平太 様
 
コメントありがとうございます。
 
  
>ちょっと具体的イメージが涌かないので、狭い範囲でいいので、
>セルの表示がどうなればいいのか示して貰えませんか?
 
いただいたシートであれば
><現状図>
> 行 _____A_____ ______B______ __C__
> 1 日付 項目 金額
> 2 2019/10/16 ブルドーザー 2,500百万円
 
><希望図>
行 _____A_____ ______B______ __C__
 1   ?      ?     ?   ←タイトルなので、セルの取得は不要です。
 2   A2      B2     C2   ←このようなイメージです。
 
ただ、このような整然とした表ではありません。
A4の用紙に手入力する欄が50セル程度あり、その記入欄を別シートに一覧としてまとめます。
セルが飛び飛びなので、各セル内にセル番地の表示ができれば、
VBAや関数を組むのに便利だと思った次第です。
 
よろしくお願いします。

回答
投稿日時: 19/10/16 13:40:46
投稿者: 半平太

>←タイトルなので、セルの取得は不要です。
 
タイトルかどうかの判定は当方では出来ないです。
 
単に1行目は対象外にして、別シート(番地シート)にアドレスを書き出すだけでよければ・・
(無ければ番地シートを自動で増やして処理)
 
対象のシートをアクティブにしてから実行する。

Sub PrintAddress()
    Dim tgtWsh As Worksheet
    Dim aCell As Range
    
    Set tgtWsh = ActiveSheet
    
    If Not tgtWsh.Evaluate("ISREF(" & "番地!A1)") Then
        ThisWorkbook.Worksheets.Add.Name = "番地"
    End If
    
    With Sheets("番地")
        .Cells.Clear
        tgtWsh.Cells.Copy
        .Select
        .Cells(1, 1).Select
        .Paste
        
        For Each aCell In .UsedRange.Offset(1).Resize(.UsedRange.Rows.Count - 1)
            aCell.Value = aCell.Address(0, 0)
        Next
    End With
End Sub

<対象シート 現況図>            <番地シート 結果図>
 行  _____A_____  ______B______  __C__      行  __A__  __B__  __C__
  1  日付         項目           金額        1  日付   項目   金額 
  2  2019/10/16   ブルトーザー   2,500       2  A2     B2     C2   
  3                                          3  A3     B3     C3   
  4               計             2,500       4  A4     B4     C4   

回答
投稿日時: 19/10/16 14:08:07
投稿者: 半平太

データが存在しないセルには表示しない方が見やすそう。
 

>    For Each aCell In .UsedRange.Offset(1).Resize(.UsedRange.Rows.Count - 1)
>    aCell.Value = aCell.Address(0, 0)
>    Next

変更後
     For Each aCell In .UsedRange.Offset(1).Resize(.UsedRange.Rows.Count - 1)
         If aCell.Value <> "" Then
           aCell.Value = aCell.Address(0, 0)
         End If
     Next

回答
投稿日時: 19/10/16 15:28:34
投稿者: MMYS

ページ設定の行列番号にチェックして印刷ではだめですか。
https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=012706
 
枠線もチェックしましょう。
https://kokodane.com/tec2_30.htm

回答
投稿日時: 19/10/16 16:11:42
投稿者: WinArrow
投稿者のウェブサイトに移動

一般機能になりますが、
 
「数式」タブの中に「数式を表示」というボタンがあります。
これをクリックすると、数式が入力さtれているセルは、全て数式に変わります。
数式の長さで列幅も変更されます。
この状態で印刷してみましょう。(行列番号一緒に)
 
再度、「数式を表示」ボタンをクリックすると、元に戻ります。
 

回答
投稿日時: 19/10/16 19:45:11
投稿者: simple

引用:
A4の用紙に手入力する欄が50セル程度あり、その記入欄を別シートに一覧としてまとめます。
セルが飛び飛びなので、各セル内にセル番地の表示ができれば、
VBAや関数を組むのに便利だと思った次第です。

関数式の理解促進とかいうことでなく、単に入力箇所の一覧を出したい、
ということなんでしょう。
 
それには、どこが入力セルなのかを明示する必要があるでしょう。
たとえば、特定の色をつけるとか。
何かしないと、こちらから、そこが入力セルだという判断はできません。
そのあたりの考え方(入力セルの判定方法)を示してもらえますか?

回答
投稿日時: 19/10/17 09:23:02
投稿者: simple

入力範囲には普通は何か、判別できる色か何かをつけているはずです。
そうしたものもないというなら、ご自分でつけるとよいのでは?
 
一案ですが、ダブルクリックのつど、
特定のシートに、その場所のアドレスを順次書き込んではどうか。
同時にそこに黄色の色を付けます。
 
Sheet1のシートモジュールに以下を書きます。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
    Worksheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value  _
        = Target.Address(False, False)
    Target.Interior.Color = 65535 '黄色
End Sub

投稿日時: 19/10/17 20:30:57
投稿者: m024240

半平太 様
返信が遅くなりました。
 
>データが存在しないセルには表示しない方が見やすそう。
>変更後
> For Each aCell In .UsedRange.Offset(1).Resize(.UsedRange.Rows.Count - 1)
> If aCell.Value <> "" Then
>    aCell.Value = aCell.Address(0, 0)
> End If
> Next
 
理想通りになりましたが、データが存在しないセルに表示するにはどう変えるよいでしょうか?

投稿日時: 19/10/17 20:40:49
投稿者: m024240

めんたん 様
 
コメントありがとうございます。
VBAだと、セルの番地も取り込むことができるんですね。
ありがとうございました。
 
 
>あとはエクセル本体とVBEを半分半分で左右にならべるとか、
>モニターをつ用意して、シート表示とVBEを分けるとかして
>アドレスを確認しやすくするくらいですかね?
 
自宅だと画面も広くて可能なんですが...。

投稿日時: 19/10/17 21:03:37
投稿者: m024240

simple 様
コメントありがとうございます。
返信が遅くなりました。
 
>関数式の理解促進とかいうことでなく、単に入力箇所の一覧を出したい、ということなんでしょう。
 
 お察しの通り、VBAを組むときのセルの番地を簡単に知りたかったからです。
 該当のファイルを添付できたらと思いました。(できるのでしょうか)
 
 
>一案ですが、ダブルクリックのつど、
>特定のシートに、その場所のアドレスを順次書き込んではどうか。
>同時にそこに黄色の色を付けます。

>Sheet1のシートモジュールに以下を書きます。
>Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
> Cancel = True
> Worksheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value _
> = Target.Address(False, False)
> Target.Interior.Color = 65535 '黄色
>End Sub
 
 コードを貼り付けてみました。
 セル番地を知りたいシートは、「入力用」シートで、
 そのシートの入力部分のセル番地を知りたいのですが、
 提示していただいたコードを、「入力用」シートに貼り付けて実行しましたが、
 黄色になるもののセル番地は表示されませんでした。
 "sheet2"は"入力用"に修正しました。
 方法が間違っているのかもしれません。
 ご教授願います。

投稿日時: 19/10/17 21:09:41
投稿者: m024240

MMYS 様
 
コメントありがとうございます。
 
>ページ設定の行列番号にチェックして印刷ではだめですか。
>https://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=012706
>枠線もチェックしましょう。
>https://kokodane.com/tec2_30.htm
 
 このようにして、セル番地を1つ1つ手作業で探して(確認して)いましたので、
 よい方法はないかと質問させていただいた次第です。

回答
投稿日時: 19/10/17 21:14:29
投稿者: simple

おっしゃる意味がわかりません。
>その記入欄を別シートに一覧としてまとめます。
ということでしたので、ダブルクリックしたセルの番地を
別シート(私はSheet2の例を出しました)のA列に順次書き出しています。
コードを読んで頂いたら解ると思いますけど。
 
入力用シートに表示したいんですか?
それだったら、何もしなくても、
現在のセルのアドレスが、画面左上の「名前ボックス」に表示されてますよ。

投稿日時: 19/10/17 21:21:59
投稿者: m024240

めんたん 様
 
コメントありがとうございました。
返信が遅くなり、すいませんでした。
コードを提示していただきありがとうございます。
 
セルを指定しておけば、その部分のセル番地が記入されるのですね。
 
>Sub 選択範囲にアドレスを書き込む()
> Dim r As Range
> For Each r In Selection
> r.Value = r.Address(0,0)
> Next
>End Sub
 
短いコードでもできるのですね。
ありがとうございました。

回答
投稿日時: 19/10/18 14:42:34
投稿者: めんたん

出来上がりの表にセル番地を入れて印刷、保存せずに閉じる、だけで解決なのですかね?
 
飛び飛びになった複数エリアにセル番地を書き込むならこのようにします。
 
Dim a As Range
Dim r As Range
For Each a In Selection.Areas
   For Each r in a.Cells
      r.value = r.Address(0,0)
   Next
Next

投稿日時: 19/10/19 12:55:55
投稿者: m024240

simple 様
 
コメントありがとうございました。
 
>おっしゃる意味がわかりません。
>その記入欄を別シートに一覧としてまとめます。
>ということでしたので、ダブルクリックしたセルの番地を
>別シート(私はSheet2の例を出しました)のA列に順次書き出しています。
>コードを読んで頂いたら解ると思いますけど。
 
 説明がまずくてすいません。
 入力用シートのセル自体にセル番地を表示させたいのです。
 
>入力用シートに表示したいんですか?
>それだったら、何もしなくても、
>現在のセルのアドレスが、画面左上の「名前ボックス」に表示されてますよ。
 
 おっしゃる通り名前ボックスに表示されていますが、
 コードを書くときに1つ1つ名前ボックスで確認するより、
 入力用シートに各セル番地が書かれたものをみて作業した方が
 効率が良いのでは?と思い質問させていただきました。
 
他の方からそれが実現できるコードも提示していただきました。
 
再三のコメントを頂きありがとうございました。

投稿日時: 19/10/19 13:04:50
投稿者: m024240

めんたん さま
 
再三のコメントありがとうございました。
 
>出来上がりの表にセル番地を入れて印刷、保存せずに閉じる、だけで解決なのですかね?
 
 入力用シートの集計を行うのに、自分が楽になるようにコードを考えようと思いました。
 その時に、入力用シートの記入部分のセル番地が、そのセル自身に表示されていたら
 名前ボックスに表示されているセル番地を1つ1つ探っていくのよりも効率的ではないかと思い、
 この質問をさせていただきました。
 
 これで、自分が思っていた状態に持って行けたので、感謝です。

投稿日時: 19/10/19 13:07:48
投稿者: m024240

色々な方にコメントいただきました。
ありがとうございました。
 
自分の説明曖昧でわかりにくいところがあったので、
これからはもっとわかりやすく説明できるようにしたいと思います。