Excel (VBA)

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

 
(指定なし : 指定なし)
selectionの理解
投稿日時: 21/04/18 14:55:20
投稿者: A太郎

前回の投稿でselectionプロパティについて質問したものです。
さらに理解するためにネット上に落ちているコードを見て、なるほどと理解したつもりでしたが・・・
下記(ネットのそのまま)を動かしても「functionまたは変数が必要です」とエラーになってしまいます。何が足りないのでしょうか?
 
任意の選択範囲に1、2、3、と記載していくコードだと理解しています。
******************************************
Sub Sample4()
    Dim i As Long
    For i = 1 To Selection.Count
        Selection(i) = i
    Next i
End Sub

回答
投稿日時: 21/04/18 17:32:45
投稿者: simple

それは正しくもあり、間違ってもいます。
単独の矩形領域ならそうでしょうが、
飛び地になっているような領域や、矩形で無い場合は
そうはなりません。
 
それはともかくとして。
 
(1)まず、実際に動かしたコードをそのまま、VBE画面からコピーして
こちらにそのまま貼り付けてください。
決して、手打ちしないことです。
もう一度、投稿して下さい。
(2)ステップ実行して、どの行でエラーがでるのかも書いて下さい。

回答
投稿日時: 21/04/18 18:25:44
投稿者: WinArrow
投稿者のウェブサイトに移動

注意事項
 
Selectionは、2つもケースがある。
1つは、セル範囲(飛び飛びもある)
もう一つは、図形
オペレータの操作を想像しないと、トラブルになる可能性がある。
 
このような理由で
Selectionがセル範囲なのか、図形なのかを確認するコードが必要である。
コードの可動性を確保する意味で
そして、それがセル範囲だったら、
Rangeオブジェクトに変換して使います。

回答
投稿日時: 21/04/18 21:17:13
投稿者: simple

想像では、たぶんスペルミスしているのではないかと思います。
 
これに関連して、
Option Explicit
をモジュールの一行目に挿入するようにして下さい。
そうすれば、今回のような未宣言の変数等には警告が出て、
しかも場所を特定してくれますから、原因が直ぐに判明します。
http://officetanaka.net/excel/vba/beginner/06.htm
 
逐一、そう書かずに済む方法があります。
「ツール」 − 「オプション」 − 「編集」 で
「変数の宣言を強制する」にチェックを入れてください。
モジュールを作成した時点で、Option Explicitが自動的に挿入されるので、
手間が省けます。
一度だけチェックを入れておきさえすれば、以後、気にする必要はありません。(生涯で一度だけ)

回答
投稿日時: 21/04/18 21:57:43
投稿者: WinArrow
投稿者のウェブサイトに移動

掲示のコードうを実行してみましたが、
エアーにはなりませんよ!

回答
投稿日時: 21/04/18 22:12:24
投稿者: simple

実際動かしたものが違うんだと思いますよ。
最初からそう指摘しています。

投稿日時: 21/04/18 22:45:39
投稿者: A太郎

回答ありがとうございます。
 
宣言のオプションを付けて、コピペして作りましたが改善されません。
エラーは、「Selection.Count」の「Selection」だけを指して「コンパイルエラー functionまたは変数が必要です」と出ています。
 
お手数おかけします。。。

回答
投稿日時: 21/04/19 07:57:18
投稿者: WinArrow
投稿者のウェブサイトに移動

A太郎 さんの引用:

宣言のオプションを付けて、コピペして作りましたが改善されません。

Option Explicit
は、改善するものではありません。
改善数ところを教えてくれる警告です。
ですから、改善するのはあなたです。
A太郎 さんの引用:

エラーは、「Selection.Count」の「Selection」だけを指して「コンパイルエラー functionまたは変数が必要です」と出ています。

simpleさんのアドバイスがキチンと伝わっていないようですね・・・・
先入観を捨てて、じっくり眺めれば、原因がhン名すると思いますが、
それでも解決しないときは、
実際のコードを掲示板にコピペしてみましょう。

回答
投稿日時: 21/04/19 09:52:40
投稿者: simple

提示されたコードが実際に動作されたものとすると、
こちらでは再現しませんので、
あなたの環境で、不幸にもなんらかの不具合に触ってしまっているのかもしれません。
新しいブックでもう一度やり直してみてはどうでしょうか。
その際、ネット上のコードをコピーペイストせず、手打ちして打ち込んでみて下さい。
(もしくは、いったんテキストエディタ(メモ帳など)に貼付けたうえで、
  それをVBEにコピーペイストして見て下さい)
動作が変わりませんか?

回答
投稿日時: 21/04/19 14:34:06
投稿者: Suzu

【関数または変数が必要です】
https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/expected-function-or-variable
 
・指定されている名前が既知の変数または Function プロシージャの名前ではない。
・プロシージャ名に値を代入しようとしている。
 
そのプロジェクト内に、slection という プロシージャが存在しませんか?

回答
投稿日時: 21/04/19 17:11:01
投稿者: Suzu

simple さんの引用:
単独の矩形領域ならそうでしょうが、
飛び地になっているような領域や、矩形で無い場合は
そうはなりません。

 
えー! と確認してみたら、確かに。。
 
Range の Selectionを使い、選択セルの範囲に処理を行う場合
問答無用で、For Each rng In Selection を使用していました。
 
なので、Selection(n) では、選択範囲のセルが返されると思っていました。
 
そうではなく、Selection(n)では、Range.Areas(1) の 列のセルを 順次参照しているのですね!!
これは、Selectionの仕様ではなく、Rangeの仕様なのですね。。ちょっと判りづらい。。
 
蛇足でした。

投稿日時: 21/04/24 17:44:03
投稿者: A太郎

皆さま 
 
返信が遅れて大変申し訳ありません。
大変丁寧な説明をありがとうございます!
まだすべて試せていませんが、いろいろやってみたいと思います。

投稿日時: 21/04/24 17:44:32
投稿者: A太郎

解決とさせていただきます。