- ベストアンサー
マクロで入力済の最初のセルを取得したい
マクロはまったくの初心者なのですが、シートに入力されている最初のセルを取得(行と列の番号)したいと思って下記の通りやってみたのですがうまくいきません。 Gyou = 1 Retu = 1 Chek1: Maxcol = Cells(Gyou,Retu).End(xlToRight).Column If MaxCol <> 0 then GoTo Chek2 End If If Gyou < 65536 then Gyou = Gyou + 1 GoTo Chek1 End If Chek2: MsgBox Maxcol としたのですが、入力されているセルはB3、C5だけです。 結果、MsgBox に表示されたのは256でした。 一番最初に入力されているセルはB3なのでMsgBoXには2と表示されると思ったのですがだめでした。 どこがおかしいのか自分では全然わかりません。あと、一番最初に入力されているセルの行番号も取得したいのですが、どなたかお教え下さい。よろしくお願いします。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
割り込みさせていただきます。 >実行すると $A$1:$B$5 と答えは出ましたが >処理の都合上、SCell = $A$1、ECell = $B$5 と >分解したいのですがわかりません。 パターンとしては、通常こういう書き方をするはずです。 つまり、Address プロパティは取っていても、Range オブジェクトは取得しています。 '------------------------------------------- Sub TestRange1() Dim first As String Dim last As String With Worksheets("Sheet1").UsedRange first = .Cells(1).Address last = .Cells(.Cells.Count).Address End With MsgBox "最初: " & first & " 最後: " & last End Sub
その他の回答 (10)
- nattocurry
- ベストアンサー率31% (587/1853)
> $A$1:$B$5 と答えは出ましたが > 処理の都合上、SCell = $A$1、ECell = $B$5 と > 分解したいのですがわかりません。 TopLeftCell BottomRightCell を使う手もありますね。 詳細はご自分でお調べください。
お礼
早速のご返事、有難うございました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>処理の都合上、SCell = $A$1、ECell = $B$5 と分解したいのですがわかりません。 Split()で文字列を分割する事も可能です。 ------------------------------------------------- Dim Hani Dim ADR Hani = Worksheets("Sheet1").UsedRange.Address ADR = Split(Hani, ":") MsgBox ADR(0) MsgBox ADR(1) -------------------------------------------- 下記のようにする事も出来ます。 MsgBox ActiveSheet.UsedRange.Cells(0).Address MsgBox ActiveSheet.UsedRange.Cells(ActiveSheet.UsedRange.Count).Address ----------------------------------------------
お礼
早速のご返事、有難うございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
#3の回答者です。 For ~ Next を抜け出すのは、#6さんのお書きになったとおりです。 ほかにも、Do ~ Whileの Exit Do もあります。 Goto を使うと可読性が落ちるという人もいますが、それは違います。そうでなく、コードのまとまりが悪いように思います。 >マクロに関しての参考書等はまったく持っていない ある程度の書籍は手に入れることをお勧めします。ネットで分かるとはお約束できません。Basicを知っているから、後は、ネットで覚えられるとお思いなのかもしれませんが、必ずしも同じではありません。ネットでは体系的に見れず、ピンポイントですから、いくらやっても蓄積してこないのです。初級文法から、中級・上級と進んで、やっと入門編が終わります。早い人で、2~3ヶ月、遅い人ですと、1年以上掛かります。英会話と同じで、最初はフレーズの単語を入れ替えるように、セルの位置などを換えて、プロシージャにします。 物事は、体系的に骨子を覚え、細かいところは後回しです。 『かんたんプログラミング Excel 2007 VBA 基礎編』技術評論社 大村 あつし (著) http://www.amazon.co.jp/exec/obidos/ASIN/477413340X このシリーズは、良い悪いは別として、これぐらいしか体系的に覚えられるものがありません。 VBAエキスパート公式サイト 推薦書籍 http://vbae.odyssey-com.co.jp/training/text.html
お礼
早速のご返事、ありがとうございました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>マクロに関して参考になるものがインターネットにあれば VBAのヘルプファイルも参考しましょう。 そしてexcelの関数の使い方や機能等の用語をしっかりと覚える事。 マクロの基本的なオブジェクトやプロパティも覚えておきましょう。 あとはネット検索の達人になることです。 「VBA 範囲取得」「VBA 最後のセル」「VBA For文」「VBA IF文」など、思いつくキーワードを使って検索をする事です。 検索したページの中から、やりたい事に一番近い事が現れたら、そのページの単語をキーに再検索とか・・・。 何度か検索すれば、VBA解説の主要なページがいくつかあることに気づくかと思うので、ブックマークして参考にして下さいね。 エクセルでお仕事 http://www.asahi-net.or.jp/~ef2o-inue/top01.html
補足
いろいろアドバイスありがとうございます。 あつかましいのですが、もうひとつ問題がでてきました。 セルA1、A5、B2に入力された状態で Hani = Worksheets("Sheet1").UsedRange.Address を実行すると $A$1:$B$5 と答えは出ましたが 処理の都合上、SCell = $A$1、ECell = $B$5 と 分解したいのですがわかりません。教えて頂くことはできますか? よろしくお願いします。
- nattocurry
- ベストアンサー率31% (587/1853)
>For Next から抜けたい時の方法がわからないので Exit For で抜けられます。
補足
ありがとうございます。 マクロに関しての参考書等はまったく持っていないので他の人がコーディングしたのを参考にして、自分なりにあれこれ考えてやっています。そこであつかましいお願いなんですが、マクロに関して参考になるものがインターネットにあれば、それをお教えていただくことはできませんか? よろしくお願い致します。
- watabe007
- ベストアンサー率62% (476/760)
No.4です Find メソッドで最初のセルを検索しましたが 検索方向は前回使われたプロパティが使われるようですので 検索方向を行方向と設定しました。 Gyou = .Find("*", SearchOrder:=xlByRows).Row Retu = .Find("*", SearchOrder:=xlByRows).Column ちなみに列方向で検索するには SearchOrder:=xlByColumns です
- watabe007
- ベストアンサー率62% (476/760)
Find メソッドを使って最初のセルを検索しました。 Sub 最初のセル() Dim Gyou As Long Dim Retu As Long Gyou = 1 Retu = 1 With ActiveSheet.Cells If IsEmpty(.Cells(1)) Then Gyou = .Find("*").Row Retu = .Find("*").Column End If End With MsgBox "行:" & Gyou & vbCrLf & "列:" & Retu End Sub シートにデータが1つも無い場合のエラー対策はしていません。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 初心者では書かないコードですね。 VBAのテキストでは Goto を入れたコードは出てきません。 これは改めないと、比較的早い段階で、現代では行き詰まってしまいます。 '------------------------------------------- Sub TestMacro1() Dim i As Long Dim j As Long Dim LastRow As Long Dim msg As String With ActiveSheet With .UsedRange '最後の行を決める LastRow = .Cells(.Rows.Count, .Columns.Count).Row End With For i = 1 To LastRow j = .Cells(i, 1).End(xlToRight).Column If j <> Columns.Count Then MsgBox j 'おまけ(アドレスを取る) msg = msg & ", " & .Cells(i, j).Address(0, 0) End If Next i End With If Len(msg) > 1 Then MsgBox Mid(msg, 2) End If End Sub
お礼
早速、指示通りのコードで実行するとうまくできました。 あと、Goto コードを使わずに条件から抜けたい時、また、 For Next 分の途中で条件を満たしたので For Next から 抜けたい時の方法がわからないので Goto を使っていますが、 なにかよい方法があればお教えくださるようにお願いいたします。 ありがとうございました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
Maxcol の取得結果としてその値が返るようになっているので仕方無いですね。 範囲の一端であれば下記で取得出来ます。 MsgBox Range(Selection.CurrentRegion.Address).Column MsgBox Range(Selection.CurrentRegion.Address).Row
お礼
早速のご返事、ありがとうございました。
- nattocurry
- ベストアンサー率31% (587/1853)
VBEで[F8]キーを押すと、1行ごとに実行してくれるので、マクロがどのような流れで実行されているのかを確認しましょう。 そうすれば、どこがおかしいのかが判ります。 > Maxcol = Cells(Gyou,Retu).End(xlToRight).Column まずはここですが、 Cells(1,1).End(xlToRight).Column の式の値は2~256のどれかにしかなりえません。 なので、 If MaxCol <> 0 then GoTo Chek2 End If ここで必ずChek2にジャンプします。 他にもいろいろありますが、まずは[F8]でステップ実行して、自分でおかしなところを探すようにしましょう。
お礼
早速のご返事、ありがとうございました。
お礼
早速のご返事、ありがとうございました。