- ベストアンサー
エクセルのシート上でセルのデータの移動
エクセルのA列のA1,A2,A3...には選手人名 が入っています。 例えばA2(田中選手)の相手となる選手名(山本 選手)をA19列から持ってきてB2にセットしたいのです。 ドラッグアンドドロップ的にB列にA列から移動したい のです。左上中白矢印ポインターを出して移動できる のは判りますが、左上中白矢印を出すのが確実に 行かないことがあるので、中白十字状態でドラッグアンド ドロップ出きるか、A19をクリックし後にB2をクリック するとA19の内容がB2に移るようにするには、VBAを どう組めば良いのでしょうか。教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
2つ考えてみました。 <その1> 最初は普通に選択し、次の貼り付けるセルはCtrlキーを押しながら選択します。 作業をするシートのコードウインドウに貼り付けます。 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) Dim kammaPot As Integer 'カンマ位置 Dim rg1 As Range, rg2 As Range '最初に選択したセルと次に選択したセル On Error GoTo ErrorHandler If Target.Count = 2 Then 'セルを2個選択している場合 kammaPot = InStr(Target.Address, ",") Set rg1 = Range(Left(Target.Address, kammaPot - 1)) Set rg2 = Range(Right(Target.Address, Len(Target.Address) - kammaPot)) rg2.Value = rg1.Value rg1.Value = "" rg2.Select End If Exit Sub ErrorHandler: End Sub -------------------------- <その2> 次は、質問のとおりにA、B列でのみ処理をするケースです。 作業をするシートのコードウインドウに貼り付けます。 なお、2つ同時には登録できません。 Dim AiteSensyu As String 'A列の選択した選手名 Dim AiteSensyuAddress As String 'A列の選択した選手の行 Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) On Error GoTo ErrorHandler If Target.Count = 1 Then If AiteSensyu <> "" Then '選手の選択が済んでいる場合 If Target.Column = 2 Then 'B列 Target.Value = AiteSensyu Range(AiteSensyuAddress) = "" '選択した選手のセルをクリア AiteSensyu = "" '選択した選手をクリア End If Else If Target.Column = 1 Then 'A列 AiteSensyu = Target.Value '選択した選手を記憶する AiteSensyuAddress = Target.Address '選択した選手のセル番地 End If End If End If Exit Sub ErrorHandler: End Sub
その他の回答 (3)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
要はセル情報の移動の簡略化を行いたいわけですよね。 確かに#2さんの発言にあったように、コピペがベストかも? 右手はマウス 左手は[Ctrl+C][Ctrl+V]を押す。 これの繰り返しがいいとは思うのですが。。。 もしどうしてもVBAで行いたいのであれば、結構制限があります。 EXCELの仕様から認識できるイベントが少ないからです。 一応サンプルを作りましたが、これはダブルクリックでセル情報を取得し、右クリックで貼り付けるプログラム(マクロ?)です。 常にダブルクリックはコピー/右クリックは貼り付けとなるために、エクセル標準のダブルクリックで編集モード、右クリックでポップアップメニューが使えなくなってます。 ですので、コピペモードと、エクセル本来のモードを切り分けるフラグを標準モジュールでフラグを宣言し、実行/解除ボタンも用意しておく事を勧めます。 以下のソースを、標準モジュールではなく、シートのモジュールに貼り付けてください。 Option Explicit 'Rangeオブジェクト変数 Private pRange As Range Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'クリックの操作無効(この場合ダブルクリックによるセルの編集モードが無効) Cancel = True 'アクティブなセルを、変数にセット With Target Set pRange = Cells(.Row, .Column) End With End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 'クリックの操作無効(この場合右クリックによるメニューの表示が無効) Cancel = True '貼り付けるものが無い時、未処理 If pRange Is Nothing Then MsgBox "移動するセルが指定されていません" Exit Sub End If 'セルを切り取って貼り付け pRange.Cut With Target Cells(.Row, .Column).Select End With Paste End Sub
- tamagawa49
- ベストアンサー率46% (123/265)
>VBAをどう組めば良いのでしょうか。教えて下さい。 VBAでは無理じゃないですかね。同じクリックする動作の1回目(切り取り)と2回目(貼り付け)に差をつけるわけですから、その途中にはマクロの実行ボタンを押さなければダメですよね。 自動で切り取れる方法も試してみたんですけど、例えば普通のモジュール1でなく、シートの方にあるWorksheet_SelectionChangeイベントでもセルをクリックすると1回目は「切り取り」になるんですが、2回目に貼り付け先のセルをクリックした瞬間、当然のことですがそのセルを切り取ってしまい貼り付けることができませんでした。 imogasiさんがご存知の(確かにいらいらしますが)マウスで移動する方法が一番早いのではないでしょうか。 ちょっと遅いですが、私ならば右クリック「切り取り」→「貼り付け」を使うかもしれませんね。参考にならなくてすみません。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
意味がよく理解できていません。 移動用のマウスカーソル状態以外でも、マウス操作でセルの内容を移動したいという事ですか?
補足
太いプラスのポインターから中が空白の矢印ポインターに変えるのに、ワンステップ、ツーステップ操作が必要だったり、上手く矢印ポインタに変えにくいことが多いので、クリックしてドラッグか、ポイント(fromから)して別のセルをポイント(toへ)して確実に移動したいためです。よろしく。実際例は選手の組み合わせでなく、多量に組み合わせるべきデータがあるため確実に迅速に操作を進めたいのです。