Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2832 / 13645 ツリー ←次へ | 前へ→

【65701】for each 文の怪 REV 10/6/23(水) 6:20 質問[未読]
【65702】Re:for each 文の怪 りん 10/6/23(水) 6:52 発言[未読]
【65703】Re:for each 文の怪 REV 10/6/23(水) 7:25 お礼[未読]
【65704】Re:for each 文の怪 Jaka 10/6/23(水) 10:50 発言[未読]
【65708】Re:for each 文の怪 REV 10/6/23(水) 11:51 お礼[未読]
【65709】Re:for each 文の怪 REV 10/6/23(水) 12:17 お礼[未読]
【65710】Re:for each 文の怪 Jaka 10/6/23(水) 13:01 発言[未読]
【65712】Re:for each 文の怪 REV 10/6/23(水) 13:45 お礼[未読]

【65701】for each 文の怪
質問  REV  - 10/6/23(水) 6:20 -

引用なし
パスワード
   はじめまして、
一応、解決はしているのですが
どうも気になって・・・

まず、コードを出します。

dim nandemoR as range,namae as string 'namaeは顧客名

'range("顧客リスト").address → $A$2:$C$51

for each nandemoR in range("顧客リスト").columns(2) 
  if nandemoR.value = namae then
    msgbox "登録済みです"
    exit sub
  end if
next nandemoR

こんなコードを書いたら
ifでエラーが出てしまいました。

nandemoR in range("顧客リスト").offset(,1).resize(,1)

に書き換えると上手く行くのですが・・・なぜ?
columnsのバージョンとoffsetのバージョンのアドレスを調べてみたのですが
どちらも $B$2:$B$51 と表示されます。

ちなみにcolumnsのバージョンの
nandemoR.valueはなぜか配列に・・・

結局offsetを使っているのですが
気になって食事も喉を通りません;;

【65702】Re:for each 文の怪
発言  りん E-MAIL  - 10/6/23(水) 6:52 -

引用なし
パスワード
   REV さん、おはようございます。

>dim nandemoR as range,namae as string 'namaeは顧客名
>
>'range("顧客リスト").address → $A$2:$C$51
>
>for each nandemoR in range("顧客リスト").columns(2) 
>  if nandemoR.value = namae then
>    msgbox "登録済みです"
>    exit sub
>  end if
>next nandemoR
>
For EachでチェックするよりはFindメソッド(検索)でチェックしたほうが簡単では?というのはさておき、

>こんなコードを書いたら
>ifでエラーが出てしまいました。
エラーメッセージの内容と、エラーが出た時のnandemoRのアドレスはどうなっていますか?

【65703】Re:for each 文の怪
お礼  REV  - 10/6/23(水) 7:25 -

引用なし
パスワード
     ▼りん さん:

>For EachでチェックするよりはFindメソッド(検索)でチェックしたほうが簡単では?というのはさておき、

findは普段使ってなくて・・・若葉なんです^^;

テキストに for each は処理が早いって書いてあったから
使えるところは for each で、って考えてました^^;

後で、勉強のために今回のコードを
find に書き換えてみます^^v

>
>エラーメッセージの内容と、エラーが出た時のnandemoRのアドレスはどうなっていますか?

エラーメッセージは
  実行時エラー13
  型が一致しません

アドレスは
columnsが $B$2:$B$51
offset が $B$2

となっています。。。そりゃ一致しないですねw

疑問なのは for each で範囲を指定した時に
columnsだと、どうして全部入ってしまうのか・・・
と言う点なのです;;

【65704】Re:for each 文の怪
発言  Jaka  - 10/6/23(水) 10:50 -

引用なし
パスワード
   ろくに理解してないので、うまく説明できないけど、
下のコードを比較してみれば、ある程度はわかる?

Sub aaaa1()
Dim Cel As Range
For Each Cel In Range("顧客リスト").Columns(2)
  Cel.Select
  MsgBox Cel.Value '←列対象なので、当然エラー
Next
End Sub

Sub aaaa2()
Dim Cel As Range
Range("顧客リスト").Offset(, 1).Resize(, 1).Select
For Each Cel In Range("顧客リスト").Offset(, 1).Resize(, 1)
  Cel.Select
  MsgBox Cel.Value
Next
End Sub

おまけ、
For Each Cel In Range("顧客リスト").Columns(2).cells

【65708】Re:for each 文の怪
お礼  REV  - 10/6/23(水) 11:51 -

引用なし
パスワード
   ▼Jaka さん:
コメントありがとうございます。

>Sub aaaa2()
>Dim Cel As Range
>Range("顧客リスト").Offset(, 1).Resize(, 1).Select
>For Each Cel In Range("顧客リスト").Offset(, 1).Resize(, 1)
>  Cel.Select
>  MsgBox Cel.Value
>Next
>End Sub
>

今、実際に使っているコードが上記の内容と
全く同じです^^

>おまけ、
>For Each Cel In Range("顧客リスト").Columns(2).cells

この、[おまけ]にすっごく、びっくりしましたw
Columns(2).Cells というコードは想像もしませんでした。
Cells そのものを理解していないから
その発想が出てこなかったのかと;;

で、実際に試して動きましたw

となると、For Each に必要なのは
[セル範囲の指定]ではなく
[複数個のセルの指定]・・・の様なニュアンス・・・?
なのでしょうか???
なんだか不思議な感じですが^^;

わからなければ
『For Each に Row/Column 禁止!』って、覚えろ!
くらいに言われちゃいそうですが、
どうにも気になっちゃいまして^^;

どちらにしても、
Column を使った For Each の使い方が
勉強になった事と
For Each に指定する物の理解の
糸口を頂き、ありがとうございました。

【65709】Re:for each 文の怪
お礼  REV  - 10/6/23(水) 12:17 -

引用なし
パスワード
   ▼Jaka さん:

ヒントありがとうございました!

解決?かも・・・?

For Each に指定する物で
あっ!っと思ったのですが、

指定する物はコレクションなんですね^^;

だからCellsなのか!・・・とw(今さらですが^^;)

今までコレクション自体、
言葉では理解していても
いまいち、実感なかったです^^;

自分なりの結論としては

Column で指定してしまうと
例え1列であっても列コレクション

そのため[おまけ]にあったように
Cellsをつけてセルのコレクションとして
指定すると期待通りに動作する

だから
For Each nandemoR in Columns(2)
こんな文を書くと
列ごとにループさせるため
当然nandemoRには配列ができちゃうw
もちろん期待通りの結果もでない^^;

こんな感じの結論に行き着きましたが
如何でしょうか?

どこか思い込み違い、勘違いがあれば
是非、ご指摘をお願いします。

あってたら、
『正解!』なんて言ってもらえても
安心できるかも^^ですw

【65710】Re:for each 文の怪
発言  Jaka  - 10/6/23(水) 13:01 -

引用なし
パスワード
   ▼REV さん:
>For Each nandemoR in Columns(2)
>こんな文を書くと
>列ごとにループさせるため
>当然nandemoRには配列ができちゃうw
>もちろん期待通りの結果もでない^^;

大体そんなニュアンスだと思います。
谷さんや歴代の解答者や、ichinoseさん辺りなら、詳しく説明できると思うけど、
最終学歴、予備校中退のアホなJakaには難しい解説が出来ません。

中退と言うと格好が良いのかも知れませんが、単に勉強するより、
(実際い、ただ通っているだけで、勉強したこと無い。無駄金。)
金稼ぎを選んだだけです。将来よりも目先の車。
(ぶっ壊した親に買ってもらった兄の車の修理代稼ぎが最初。)
こんなアホに返答貰っているとげんなりするとは思いますので、奮起して優秀な回答者になってもらえたらと思います。

【65712】Re:for each 文の怪
お礼  REV  - 10/6/23(水) 13:45 -

引用なし
パスワード
   ▼Jaka さん:

この度はご指導ありがとうございました^^

これで、ほんの少しは構造を理解したうえでの
コード書きができそうですw

>こんなアホに返答貰っているとげんなりするとは思いますので、奮起して優秀な回答者になってもらえたらと思います。

無茶ですwww思いっきりど素人なんで回答者なんて^^;
しかもオール独学なんで
間違って覚えてる事も多々ありそうだし・・・
それ以前に理解不足の方が多い気もしますが(今回みたいにw)

でも、とりあえずこのサイトを
お気に入りに・・・っと♪

また、食事も喉を通らないような
疑問が出てきたら寄らせて頂くかも知れませんww

その時は、ご指導よろしくお願い致します♪

ありがとうございました^^

P.S.
今までのコメに『他』で返す方法がわからず
『礼』で出していましたが
『発言』を選べば良かったんですね^^;
今さら見つけましたwww

2832 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free