• ベストアンサー

マクロで入力済の最初のセルを取得したい

マクロはまったくの初心者なのですが、シートに入力されている最初のセルを取得(行と列の番号)したいと思って下記の通りやってみたのですがうまくいきません。   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と表示されると思ったのですがだめでした。 どこがおかしいのか自分では全然わかりません。あと、一番最初に入力されているセルの行番号も取得したいのですが、どなたかお教え下さい。よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.10

割り込みさせていただきます。 >実行すると $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

gatyako
質問者

お礼

早速のご返事、ありがとうございました。

その他の回答 (10)

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.11

> $A$1:$B$5 と答えは出ましたが > 処理の都合上、SCell = $A$1、ECell = $B$5 と > 分解したいのですがわかりません。 TopLeftCell BottomRightCell を使う手もありますね。 詳細はご自分でお調べください。

gatyako
質問者

お礼

早速のご返事、有難うございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.9

>処理の都合上、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 ----------------------------------------------

gatyako
質問者

お礼

早速のご返事、有難うございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

#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

gatyako
質問者

お礼

早速のご返事、ありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.7

>マクロに関して参考になるものがインターネットにあれば VBAのヘルプファイルも参考しましょう。 そしてexcelの関数の使い方や機能等の用語をしっかりと覚える事。 マクロの基本的なオブジェクトやプロパティも覚えておきましょう。 あとはネット検索の達人になることです。 「VBA 範囲取得」「VBA 最後のセル」「VBA For文」「VBA IF文」など、思いつくキーワードを使って検索をする事です。 検索したページの中から、やりたい事に一番近い事が現れたら、そのページの単語をキーに再検索とか・・・。 何度か検索すれば、VBA解説の主要なページがいくつかあることに気づくかと思うので、ブックマークして参考にして下さいね。 エクセルでお仕事 http://www.asahi-net.or.jp/~ef2o-inue/top01.html

gatyako
質問者

補足

いろいろアドバイスありがとうございます。 あつかましいのですが、もうひとつ問題がでてきました。 セルA1、A5、B2に入力された状態で Hani = Worksheets("Sheet1").UsedRange.Address を実行すると $A$1:$B$5 と答えは出ましたが 処理の都合上、SCell = $A$1、ECell = $B$5 と 分解したいのですがわかりません。教えて頂くことはできますか? よろしくお願いします。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.6

>For Next から抜けたい時の方法がわからないので Exit For で抜けられます。

gatyako
質問者

補足

ありがとうございます。 マクロに関しての参考書等はまったく持っていないので他の人がコーディングしたのを参考にして、自分なりにあれこれ考えてやっています。そこであつかましいお願いなんですが、マクロに関して参考になるものがインターネットにあれば、それをお教えていただくことはできませんか? よろしくお願い致します。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.5

No.4です Find メソッドで最初のセルを検索しましたが 検索方向は前回使われたプロパティが使われるようですので 検索方向を行方向と設定しました。 Gyou = .Find("*", SearchOrder:=xlByRows).Row Retu = .Find("*", SearchOrder:=xlByRows).Column ちなみに列方向で検索するには SearchOrder:=xlByColumns です

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.4

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)
回答No.3

こんにちは。 初心者では書かないコードですね。 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

gatyako
質問者

お礼

早速、指示通りのコードで実行するとうまくできました。 あと、Goto コードを使わずに条件から抜けたい時、また、 For Next 分の途中で条件を満たしたので For Next から 抜けたい時の方法がわからないので Goto を使っていますが、 なにかよい方法があればお教えくださるようにお願いいたします。 ありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

Maxcol の取得結果としてその値が返るようになっているので仕方無いですね。 範囲の一端であれば下記で取得出来ます。 MsgBox Range(Selection.CurrentRegion.Address).Column MsgBox Range(Selection.CurrentRegion.Address).Row

gatyako
質問者

お礼

早速のご返事、ありがとうございました。

  • nattocurry
  • ベストアンサー率31% (587/1853)
回答No.1

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]でステップ実行して、自分でおかしなところを探すようにしましょう。

gatyako
質問者

お礼

早速のご返事、ありがとうございました。

関連するQ&A