アプリ版:「スタンプのみでお礼する」機能のリリースについて

よろしくお願いいたします。
A列には入力したくない行に"a"が入力してあるとします。
B列に上の行から数値を入力していくのですが、数値を入力してEnterを押すと次のA列に"a"が入力されていない行のB列セルに移動するVBAを教えてください。

A 回答 (6件)

シート名タブを右クリックしてコードの表示を選び,現れたシートに下記をコピー貼り付けます



private sub Worksheet_Change(byval Target as excel.range)
 if activecell.column <> 2 then exit sub

 do until cells(activecell.row, "A") <> "a"
  activecell.offset(1).select
 loop
end sub

入力して,B列にとどまった場合に作動します。(例えばTab入力でC列に移動するとかでは作動しない)

#既出回答で寄せられているマクロも同様にして登録しますが,1枚のシートに複数のこれらのマクロを同時に書いて作動させることは(原則として)出来ません。皆さんの回答を試すときは,イチイチブックを(シートを)複写してそれぞれ独自に動作を確認してください。


#selectionchangeイベントを使うのも良い方法に思いましたが,aの行に用事があってデータを記入したい場合にも素直に出来なくなってしまうので注意が必要です。

#changeイベントは,ご相談で想定している「セルに記入してEnterした」ばかりでなく,たとえば「オッと書き間違えたDeleteで消しました」とか「コピー貼り付けやオートフィルドラッグ等で複数のセルにデータを記入した」「セルをまとめて選んで消去した・行挿入・行削除した」などでも起動します。そういった「想定外」操作において,用意したマクロが意図しない動作をしないかキチンとチェックしておく事が完成度を高めますので,一体どういう具合に動作したら(=どんなマクロにしとけば)一番使い勝手がイイのか良く検討してみてください。

この回答への補足

ご返答ありがとうございました。試してみたところほぼうまくいったのですが、B列だけでなくD列やG列でも同様の動きをさせたいときは、どう追加すればいいですか?

補足日時:2011/05/06 22:11
    • good
    • 0

ん?


>B列だけでなくD列やG列でも

変更前:
if activecell.column <> 2 then exit sub

変更後:
if application.intersect(activecell, range("B:B,D:D,G:G")) is nothing then exit sub


他にも,変更前のサンプルマクロを応用して「AND条件で,2でなく,4でもなく,6でもなければ即終了」のようにしてもOKです。
2とか4とは,もちろん2列目(B列)や4列目(D列)の事です。
    • good
    • 0
この回答へのお礼

できました!!大変参考になりました。ありがとうございました。今後もお世話になるかもしれません。よろしくお願いいたします。

お礼日時:2011/05/07 23:23

自分では作れないVBAマクロなんて厄介なものを使わずに、



オートフィルタで、A列が"a"じゃないものだけ表示させてから、普通にB列に入力していけば良いと思いますけど、それだと何か不都合でもありますか?
    • good
    • 0

Private Sub Worksheet_Change(ByVal Target As Range)


If Target.Column = 2 Then
'MsgBox Target.Address
i = Target.Row + 1
p1:
If Cells(i, "A") = "a" Then
i = i + 1
GoTo p1
Else
Cells(i, "B").Select
End If
End If
End Sub
既出回答に同じものがあれば、すみません無視してください。
例データ A列は入力全に設定有り(a以外の行を空白にしているが、何かa以外の文字が入っていても同じ。
下記は入力後の状態。
A列    B列
3
a
12
1
5
a
a
7
a
3
a
6
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。試してみたところ、既出のものと同様ほぼうまくいきました。参考にさせていただきます。

お礼日時:2011/05/06 22:18

こんにちは!


参考程度で・・・

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 2 And Selection.Count = 1 Then
If Target.Offset(, -1) = "a" Then
Target.Offset(1).Select
End If
End If
End Sub

こんな感じではどうでしょうか?m(__)m
    • good
    • 0
この回答へのお礼

ご返答ありがとうございました。試してみたところSelectionChangeではなくChangeのほうが都合がよかったので、そちらを採用することにしました。すごくシンプルでわかりやすかったです。

お礼日時:2011/05/06 22:14

Private Sub Worksheet_Change(ByVal Target As Range)



If Target.Column = 2 Then
For i = Target.Row + 1 To Rows.Count
If Range("A" & i) <> "a" Then
Exit For
End If
Next
Range("B" & i).Select

End If

End Sub


とかいかがですか。
    • good
    • 0
この回答へのお礼

お早いご返答ありがとうございました。試してみたところほぼうまくいきました。シンプルな内容で参考になりました。またよろしくお願いいたします。

お礼日時:2011/05/06 22:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!