[[20050615230813]] 『セルの移動先自動化』(のViた) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セルの移動先自動化』(のViた)
 あるリストについて処理の内容によって入力必要なセルが違うので
処理内容ごとのボタンを設けてEnter後の移動先を
マクロで切り替えられるようにしようと思っています。
とりあえず処理1として過去ログを参考に下記のマクロを作ってみましたがボタンをクリックしたら
「実行時エラー"91" オブジェクト変数又はWithブロック変数が設定されていません」
と表示されてしまいます。不具合点をご指導お願いします。
Sub 処理1()
Dim rw As Variant, cL As Variant
Dim Target As Range
rw = Target.Row
cL = Target.Column
    If ActiveCell.Count > 1 Then Exit Sub
    If cL <> 2 Then Exit Sub
    Cells(rw, 7).Select
Select Case Target.Address
     Case Cells(rw, 8)
        Cells(rw, 13).Select
     Case Cells(rw, 14)
        Cells(rw, 17).Select
     Case Cells(rw, 18)
        Cells(rw, 18).Select
     End Select
End Sub

 変数 Target は宣言しているだけで、Range オブジェクトへの
 参照を設定してないからでしょう。 (wizik)

 早速の回答有難う御座います。
「Range オブジェクトへの参照を設定していない」とは
具体的にどういうコードがどこにされていないかお教えください。
(毎度毎度お世話をおかけして申し訳ないです。)(のViた)

 >具体的にどういうコードが
 Set Target = ActiveCell という感じで値を代入しておきましょう。

 >どこにされていないか
 Target を使用する前にです。 (wizik)

 有難う御座いました。エラーは出なくなりましたが、
Enter後の移動が指定した通りの所へ行かず、横へ一マスづつ動くだけです。
サンプルのをそのままコピーしてきてRangeをCellsに置き換えただけなんですが・・・。
何が抜けているんでしょうか?。入力せずにEnterだけではだめなんでしょうか?
  (のViた)

 >入力せずにEnterだけではだめなんでしょうか
 SelectionChangeイベントを使う必要が有ります。
http://ryusendo.no-ip.com/~ken/cgi-bin/uploader/src/0039.xls
簡単なサンプルを作りました。
(kenbou)

 (kenbou)さん、せっかくサンプルを提示していただいたのに理解できませんでした。
それでも何とかあれやこれやと"判る範囲で"やってみましたがうまくいかず
コードもごちゃごちゃになってきてわけがわからなくなってきました。
やりたい事をまとめると
1、処理内容によって入力必要なセルが違う
2、各処理はボタンで切り替える(それによりセルの移動パターンを切り替える)
3、処理を行なわない時はEnterを押してもセルは飛ばない(ボタンを押すまで普通のまま)
4、処理は行単位で行なわれる(右に動いていくだけ)
5、セルの中を書き換えても書き換えなくてもEnterを押したら移動する
6、シート内はWorksheet_ActivateやWorksheet_Changeも存在するのでそれらに影響させない
もう一度判るようにヒント&チャンスを下さい。(のViた)

 ボタンを押すと違うMsgBoxが表示されるのは、お分かりになりましたか?
その、MsgBoxの所に
>処理内容によって入力必要なセルが違う
その処理を書きます。
(kenbou)

 >各処理はボタンで切り替える
 その各処理というのは出来てるんですか? (wizik)

 >その、MsgBoxの所に
>>処理内容によって入力必要なセルが違う
>その処理を書きます。
助言の通りにしてみましたがボタンをクリックすると
「コンパイルエラー 名前が適切ではありません:flag」
と表示されます。単純に移しただけではだめと言う事でしょうか?

シートのコードは次のとおりです。

 Option Explicit
Private Sub CommandButton1_Click()
    flag = 1
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rw As Variant, cL As Variant
rw = Target.Row
cL = Target.Column
    処理1 rw, cL, Target
End Sub

標準モジュールには下記のコードです。

 Option Explicit
Public flag As Integer
Sub 処理1(rw, cL, Target)
    Select Case flag
        Case 1
Select Case Target.Address
     Case Cells(rw, 3)
        Cells(rw, 7).Select
     Case Cells(rw, 8)
        Cells(rw, 13).Select
     Case Cells(rw, 14)
        Cells(rw, 17).Select
     Case Cells(rw, 18)
        Cells(rw, 18).Select
     End Select
End Select
End Sub
>その各処理というのは出来てるんですか? 
処理はまだ処理1しか出来ていません。
これがうまく動いたら処理2,処理3・・・と増やすつもりをしていましたので。
(のViた)

 >「コンパイルエラー 名前が適切ではありません:flag」と表示されます
 名前変えても表示されますか? 

 それと、Select Case の Case Cells(rw, 3) は 
 Case Cells(rw, 3).Value と同じと思いますが、それでいいんでしょうか。 (wizik)

 夜遅くのご対応誠に有難う御座います。
名前を変えるとエラーは出なくなりましたが、ボタンを押したときにカーソル
(なんと呼ぶのか正式名称を知りませんがアクティブセルの枠が太線になる現象)が消えて
何処かのセルをクリックしないと何をしても出てきません。
出てきた後も狙った通りにはならず、普通に一つずつ動いていきます。なぜなんでしょうか?
<Case Cells(rw, 3).Value と同じと思いますが
見つけたとこのをそのままコピーしてきて、RangeをCellsに置き換えただけだけなんで
これで間違いはないと思うんですが、こちらで使用するには無理があったのかも・・・
(のViた)

 >ボタンを押したときにカーソル(なんと呼ぶのか正式名称を知りませんがアクティブセルの枠が太線になる現象)が消えて
 >何処かのセルをクリックしないと何をしても出てきません。
 ボタンにフォーカスが移るからだと思います。
 ActiveCell.Activate とか入れてもダメでしょうか。

 >出てきた後も狙った通りにはならず、普通に一つずつ動いていきます。なぜなんでしょうか?
 F9キーでブレークポイントを設定して、
 F8キーでステップ実行しながら動きを確認してみてはどうでしょうか。
 このとき、マウスカーソルを変数などに重ねれば中身を確認できます。 

 >見つけたとこのをそのままコピーしてきて、RangeをCellsに置き換えただけだけなんで
 どのスレに書かれていたものでしょうか。 

 Select Case Target.Address を Select Case Target に変更するとどうなりますか? (wizik)

 おはようございます。
flag = 1とEnd Subの間にActiveCell.Activate を入れてみたら
フォーカス(って言うんですか?)は消えませんでした。(入れる所は合っていますか?)
又、ステップ実行してみるときちんとコードは進んで行きrw, cL, Targetの値は現在のセル値を表示します。
それでEnterを押して飛ぶはずの位置に来ててrw, cLもコードの設定された値を出しているのに
飛びません。やはりコードの記述が間違っているような気がしますが
どう間違っているのかがわかりません。
もしわかっておられましたらぜひお教えください。
>どのスレに書かれていたものでしょうか
はっきりは覚えてないんですが「Excel(エクセル)技道場」って所だった様な気がします・・。
(のViた)

 って入力しているうちに新しい提案がされていたなんて(きーをうつのがおそくて・・・)
早速試したところ Case Cells(rw, 14)までセルは動いて以降は止まったままになります。
(ステップ実行してみるとコードは最後までスムーズに流れています。
あともうチョットと言う所なのに〜。まだ何が悪さしてるんでしょうか?
とりあえず仕事の時間が終わっちゃったので家に持ち帰ってすこしやってみます。(のViた)

 >Case Cells(rw, 14)までセルは動いて以降は止まったままになります。
 止まったままになるとは、どういうことでしょうか。 (wizik)

 こんばんは、今日もお世話になりますがどうぞ宜しくお願いいたします。
さて早速「止まったまま」についてですが、Cells(rw, 13)の位置で止まっています。
Enterを押すとほんの一瞬隣のセルあるいはCells(rw, 17)に行っているような
瞬間があり(フラッシュが光った感じ)Cells(rw, 13)に戻ってきて
あたかも固定されているかのごとく止まっています。
原因は何なんでしょう?
[20050611161646]『平均値の更新』でデーターを入力セルがCells(rw, 17)なので
何か関係有るのかと変数名を変えたり、飛ばす所をもっと関係の無い右の方にしてみても同じでした。
 {訂正}今回のコードを参照させてもらったのは「Let's Excel VBA」ってホームページで
「Excel(エクセル)技道場」では有りませんでした。(のViた)

 >Enterを押すとほんの一瞬隣のセルあるいはCells(rw, 17)に行っているような
 >瞬間があり(フラッシュが光った感じ)Cells(rw, 13)に戻ってきて
 >あたかも固定されているかのごとく止まっています。
 >原因は何なんでしょう?
 きちんとステップ実行して、自分でどう動いているのかを確認してください。

 Sub 処理1(rw, cL, Target)
     Select Case flag
         Case 1
             Select Case Target.Column
                 Case 3
                     Cells(rw, 7).Select
                 Case 8
                     Cells(rw, 13).Select
                 Case 14
                     Cells(rw, 17).Select
                 Case 18
                     Cells(rw, 18).Select
             End Select
     End Select
 End Sub

 処理1をこのようにしたらどうなりますか?
 「何を言えばいいんだろ」と思いながらだらだら続けてきたけど、もうやめにします。  
  私はデバッガじゃありません。 (wizik)

 SelectionChangeイベントを使っているのなら
最初に
Application.EnableEvents = False
最後に
Application.EnableEvents = True
としてイベントを無効にしてあげないと最後のセルに行ってしまいそうな気がします。
(kenbou)

 ぱっと見なので勘違いしてましたら、ごめんちゃいですけど、、
多分、こういうことじゃないんですか??
シートモジュールに
Option Explicit
Private Sub CommandButton1_Click()
    flag = 1
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rw As Long
Dim cL As Long
If Target.Count > 1 Then Exit Sub
rw = Target.Row
cL = Target.Column
処理1 rw, cL
End Sub
標準モジュールに
Option Explicit
Public flag As Integer
Sub 処理1(ByVal rw As Long, ByVal cL As Long)
Application.EnableEvents = False
    Select Case flag
        Case 1
            Select Case cL
                Case 3
                    Cells(rw, 7).Select
                Case 8
                    Cells(rw, 13).Select
                Case 14
                    Cells(rw, 17).Select
                Case 18
                    Cells(rw, 18).Select
            End Select
    End Select
'    flag = 0'必要に応じてフラグを初期化します。
Application.EnableEvents = True
End Sub
(SoulMan)

 私もサンプルを作ってみました。
http://ryusendo.no-ip.com/~ken/cgi-bin/uploader/src/0040.xls
(kenbou)

 それから、ブレイクポイントも覚えられた方がいいですよ。

(SoulMan)

 お返事が遅くなり申し訳ありませんでした。
wizikさん、理解力が乏しいせいであきれさせてしまったようですね。
どうしても動かない理由がわからなかったのです。ごめんなさい。
wizikさん,kenbouさん,SoulManさんのご協力、ご指導によりやっと完成しました。
標準モジュールのコード全行ブレークポイントを付けて実行してみたんですがわからなかったんです。
ステップ実行させるとCells(rw, 13).Select以降順調に実行して行ってるかのごとく
黄色矢印は動いているのにcLの値が13から変化しなかったので困ってたんです。
今は教えて頂いたコードで問題なく動くんですが、
Case Cells(rw, 14)だとおかしくてCase 14だとちゃんと動くというのが未だにわかりません。
Select Case Target.ColumnやSelect Case cLやSelect Case ActiveCell.Offset(, -1).Columnが
ミソ(?)だとおもいますので、最後にもう一度解る様に解説をお願い出来ますでしょうか?
ひつこい奴だとお思いでしょうがお願い致します。(のViた)

 SelectionChangeイベントが発生するタイミングですよね。
>ActiveCell.Offset(, -1).Columnが・・・・・
まさしく、ミソだと思いますよ。編集後のセルの移動設定次第で変わるところです。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    MsgBox ActiveCell.Address
End Sub
これを試して見てください。どこのセルアドレスが表示されるでしょうか?
移動したセルのアドレスが表示されるのが分ると思います。
(kenbou)

 またもお返事が遅くなり申し訳ありません。
kenbouさんの見本については了解しました。
質問についてあれから考えたんですが、rw(行)はすでにはっきりしているが
cL(列)について明示されていないのでTarget.Addressだけだと
列位置がはっきりされてないので、イベントの発生する列位置を特定する為にColumnやcLに
変えているんではないかなと思ったんですが、合っていますか?
(やっぱりなんか違う様な気が・・・・のViた)

 ありゃ、お返事してなかったかな??
 もしもそうだったらごめんなさいね。
 >明示されていないのでTarget.Addressだけだと
 その時どう考えたかは覚えてないけど、
 >Select Case Target.Address 
 このケースに該当させるんだったら、"$A$1"とかの文字になるんじゃないのかなぁ??
 だってAddressは文字ですからね。つまり、
 >Case Cells(rw, 3)
 これだと引っかからないでしょ?
 つまり、これだと多分、Cells(rw, 3)にある値をみる様になるんじゃないのかな?
 こういうトラブルを回避する為にもプロパティはいつも書く様にした方がいいですよ。
 例えば、
 Cells(rw, 3).Value
 とかね
 >合っていますか?
 というかぁ、、Targetの列をそのまま標準モジュールに渡してるんだから、、
 Targetの列が「3」だったら、、とかとうい解釈でいいんじゃないでしょうか?
 わかったかな???
 うまく説明出来なくてごめんなさいね。
(SoulMan)

 SoulManさん、ありがとうございます。
最初のAddressが付いていると動かないのは「住所で聞いてるのに座標で答えていたから
かみ合わずどこへ行ったらよいのか解らない」という風に理解したんですがこれでいいですか?
 >値をみる様になるんじゃないのかな?
SoulManさんの推察が合っている様で、もう一度前のコードで動かしてみた所
イベントが発生するセルににすでにデーターが入っているとちゃんと次へ移動して、
空っぽだとその場所に止まったままになりました。
まだ完全ではありませんが、何となく少し解った気がします。
(まだまだ霧は深いです。)
皆様どうもありがとうございました。(のViた)

 >住所で聞いてるのに座標で答えていたからかみ合わずどこへ行ったらよいのか解らない
 うん、おしい〜〜!!(^^;
 でも難しいねぇ、、私風にいうと
「住所で聞いてるのに値で答えてる」かな??同じ様なもんですけどね。
 そういえば、マクロをやり始めたころはやたらとMsgBoxで変数の中身をみてましたねぇ。。
 だから今回の場合も
 Msgbox Target.Address
 としていればすぐにわかったと思いますよ。
 Msgbox Cells(rw, 3)
 とかね。。そうすると、、「ありゃりゃ全然ちがうわ」となって霧もはれるでしょう・・・?
 なんちゃって、、頑張ってね。ではでは、、
(SoulMan)

 >MsgBoxで変数の中身・・・
なるほどメッセージボックスですか・・、うーんそういう使い方もあるんですねぇ。
今はコードの書き方にまとまりがないので、どれが確認用か表示用か解らなくなりそうですが
出来るだけ使う様にしてがんばりたいと思います。
それでも解らない事の方が多いと思いますので、
その時は又ご指導、ご鞭撻の程宜しくお願い致します。(のViた)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.