- ベストアンサー
エクセル マクロのキー入力
マクロ初心者です、過去の質問を調べたのですが、VBAでキー入力の処理が解りません。 今は、C列~H列とU列に数字を入力してからVBAを実行していますが、H~Uへ移るのに→で移動しています。 毎回面倒なので、最初に入力してU列を入力してからそのまま今のマクロを実行したくなりました、が、VBAでキー入力の処理が解りません。 Office2000ParsonalなのでマクロでVLOOKUPは使えませんが、行と列の移動は変数を使って出来ますので、そういったことは省いて頂いて結構です。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
プロシージャ内にプロシージャを記述することはできません。 Sub から End Sub をプロシージャといいます。 Sub はプロシージャの開始 End Sub はプロシージャの終了 を示します。 掲載されたコードでは最終の2行に End Sub End Sub が2個ありますが、VBAは1行ずつ認識され実行されます。 つまり Private Sub Worksheet_Change(ByVal Target As Range) という新しいプロシージャの開始行が記述されているので Sub Macro1() に対する End Sub が記述されていない状態になっている。というわけです。 プロシージャにも種類があり、記述する場所(モジュール)を選ばなければなりません。 >Private Sub Worksheet_Change(ByVal Target As Range) >If Target.Column = 8 Then 'H列か? >ActiveCell.Offset(0, 13).Select '13列右に(U列に)飛べ >End If >End Sub 上記プロシージャはイベントプロシージャと言われるものでシートモジュールに記述されるべきものです。 該当のシート見出しを右クリック>コードの表示 と進めばVBEが起動します。 該当のシートモジュールが表示された状態になっています。コードウインドウにコピペしてください。 Worksheetの内容がChangeされたら、このプロシージャが実行されます。 セルデータの書き換え、というChangeイベントが発生した時に実行されるものです。 内容は H列のセルデータが入力、あるいは書き換えられたら、自動的に同じ行で13列右のU列セルを選択 といったようになっています。
その他の回答 (2)
- xls88
- ベストアンサー率56% (669/1189)
>このようにカーソルは13行目のC列にあります、 >ここからFor next で6個入力してからH行にとばそうと思っています。 >End Sub の前にコピペして実行すると、End Subがありませんと表示されてしまいます。 End Subの前に何をコピペされたのですか? 上手くいっていなくても結構ですので、現状のコードを掲載できないでしょうか。
補足
以下のようにして実行するとEnd Subがありませんとなり実行できません、ここがクリヤーできたら For Nextを組み込もうと思っています Sub Macro1() ' Range("I1").Select TS = Range("I1").Value TS1 = TS - 398 TS2 = 3 Cells(TS1, TS2).Select Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 8 Then 'H列か? ActiveCell.Offset(0, 13).Select '13列右に(U列に)飛べ End If End Sub End Sub
- chie65536
- ベストアンサー率41% (2512/6032)
キーによるセルカーソルの移動はマクロでは書けません。 その代わり「指定したセルを選ぶ」事により、カーソルを強制移動させる事が出来ます。 「どこを選ぶかの基準」は「今カーソルがある所」を示す「ActiveCell」が基準になります。 1列右であれば「列が+1」なので「Offset(0, 1)」を使います。 1行下であれば「行が+1」なので「Offset(1, 0)」を使います。 1列左であれば「列が-1」なので「Offset(0, -1)」を使います。 1行上であれば「行が-1」なので「Offset(-1, 0)」を使います。 従って、以下のようになります →キー:ActiveCell.Offset(0, 1).Select ←キー:ActiveCell.Offset(0, -1).Select ↓キー:ActiveCell.Offset(1, 0).Select ↑キー:ActiveCell.Offset(-1, 0).Select 移動は1つづつである必要は無いので ActiveCell.Offset(10, -5).Select と書けば「10行下の、5列左」に一気に飛びます。 これを利用すれば、H列からU列に一気にカーソルを飛ばす事が出来ます。 ワークシートのChangeイベント(値が変化した時に自動的に呼ばれるイベント)に Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 8 Then 'H列か? ActiveCell.Offset(0, 13).Select '13列右に(U列に)飛べ End If End Sub と書いておくと、H列にデータを打ち込んだ瞬間、カーソルがU列に飛びます。 また、上記の応用で「U列のデータが変化したらVBAで何かやる」のも可能なので、U列の入力が終ってから手動でVBAを呼ぶ必要が無くなります。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 8 Then 'H列か? ActiveCell.Offset(0, 13).Select '13列右に(U列に)飛べ ElseIf Target.Column = 21 Then 'U列か? やりたい事をここに書く End If End Sub
お礼
ありがとうございました、せっかくの回答を生かすだけの知識がありませんでした。 Xls88さんのアドバイスでうまくいきました。
補足
早速の回答ありがとうございます。 質問がおかしかったようです、 Sub Macro1() Range("I1").Select ’I1のデータは行を決める為のデータで411が入っています TS = Range("I1").Value TS1 = TS - 398 ’13行目に数字2桁を書き込みたい TS2 = 3 Cells(TS1, TS2).Select End Sub このようにカーソルは13行目のC列にあります、ここからFor next で6個入力してからH行にとばそうと思っています。 End Sub の前にコピペして実行すると、End Subがありませんと表示されてしまいます。
お礼
ありがとうございました、プロシージャに関しての知識は殆どありませんでした、おかげさまでうまくいきました。 試しにモードを切り替えられないかと思い、以下のようにやってみたらうまく行ったので快適になりました。 Private Sub Worksheet_Change(ByVal Target As Range) CS = Range("A1").Value If CS = 1 Then ’A1が1だったら数字入力モード If Target.Column = 8 Then 'H列か? ActiveCell.Offset(-1, 13).Select '13列右に(U列に)飛べ Else: ActiveCell.Offset(-1, 1).Select End If Else: ActiveCell.Offset(0, 0).Select ’一般入力モード End If End Sub