エクセルのA列のA1,A2,A3...には選手人名
が入っています。
例えばA2(田中選手)の相手となる選手名(山本
選手)をA19列から持ってきてB2にセットしたいのです。
ドラッグアンドドロップ的にB列にA列から移動したい
のです。左上中白矢印ポインターを出して移動できる
のは判りますが、左上中白矢印を出すのが確実に
行かないことがあるので、中白十字状態でドラッグアンド
ドロップ出きるか、A19をクリックし後にB2をクリック
するとA19の内容がB2に移るようにするには、VBAを
どう組めば良いのでしょうか。教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0

要はセル情報の移動の簡略化を行いたいわけですよね。



確かに#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
    • good
    • 0

>VBAをどう組めば良いのでしょうか。

教えて下さい。

VBAでは無理じゃないですかね。同じクリックする動作の1回目(切り取り)と2回目(貼り付け)に差をつけるわけですから、その途中にはマクロの実行ボタンを押さなければダメですよね。

自動で切り取れる方法も試してみたんですけど、例えば普通のモジュール1でなく、シートの方にあるWorksheet_SelectionChangeイベントでもセルをクリックすると1回目は「切り取り」になるんですが、2回目に貼り付け先のセルをクリックした瞬間、当然のことですがそのセルを切り取ってしまい貼り付けることができませんでした。

imogasiさんがご存知の(確かにいらいらしますが)マウスで移動する方法が一番早いのではないでしょうか。

ちょっと遅いですが、私ならば右クリック「切り取り」→「貼り付け」を使うかもしれませんね。参考にならなくてすみません。
    • good
    • 0

意味がよく理解できていません。



移動用のマウスカーソル状態以外でも、マウス操作でセルの内容を移動したいという事ですか?

この回答への補足

太いプラスのポインターから中が空白の矢印ポインターに変えるのに、ワンステップ、ツーステップ操作が必要だったり、上手く矢印ポインタに変えにくいことが多いので、クリックしてドラッグか、ポイント(fromから)して別のセルをポイント(toへ)して確実に移動したいためです。よろしく。実際例は選手の組み合わせでなく、多量に組み合わせるべきデータがあるため確実に迅速に操作を進めたいのです。

補足日時:2001/11/18 10:04
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB データテーブルA列とB列があった時、B列の1行目から1stepずつデータを入力していきたい

AddDataTableRowメソッドにて
1月として、A列は日付で先に31日分の行が作成されます。その際にB行はNothingで生成しました。
私は、A列はそのままでB列の1行目から1つずつ書き込んでいくコーディングが知りたいです。
現在はAddDataTableRowのためA列の最後の行の次の行が追加され入力されてしまいます。

Aベストアンサー

whereで列BがNothingだけにして、列AのMinの値を取得
列A指定して、狙い打ちでUpdate

QOLE ドラッグアンドドロップの代わりに

いつもお世話になっています。

VBに、OLEドラッグアンドドロップというのがVBでありますよね。

これと同じようなことを、Commandなどをクリックしたとき発生させたいのですが、どうすればよいでしょう。

具体的に言うと、これで実現できるようなデータの受け渡しをしたいのです。ドラッグアンドドロップをさせるのは面倒なので、なんとかデータをボタンクリック一つで実現させたいのです。
クリップボード経由を使うという手もあるかもしれませんが、これを使うと、特殊なデータは渡せないようですし……

つまり、ドラッグアンドドロップで受け渡されるDataObjectを、クリックだけで別のフォームやリッチテキストボックスなどに受け渡すというか貼り付けられるようにしたいのです。
DataObjectと似たようなものがあればいいんですが、見つかりませんし……

どうすればいいのか全く分かりません。些細な情報でも良いので、どうか教えてください。

よろしくお願いします。(ちなみに、VB6です)

Aベストアンサー

ごめんなさい。VBで一度やったことがあったと思うんだけど、どっかにいっちゃった・・・

Cだったら、おそらく・・・

< DROPFILESTRUCT構造体 >
typedef struct {
int nSize; // この構造体のサイズ
POINT ptMousePos; //マウスの位置
BOOL fInNonClientArea;//マウスが非クライアント領域の時,TRUE
BOOL fUnicode; //パス名がUnicodeの時, TRUE
} DROPFILESTRUCT, *LPDROPFILESTRUCT;
(1)GlobalAllocでメモリーをキープHDROP型に変換

(2)PostMessage(hTarget, WM_DROPFILES, hDrop, 0) ;
「PostMessage」は、WM_DROPFILESメッセージをチェックして、
こちら側のデータを 相手側のメモリー空間にコピーしてくれる。
 * SendMessageではダメ!

(3)グローバルメモリー開放
の手順でいけると思います。VBにコンバートする必要がありますが・・・結構苦労したような記憶があります^^;

ごめんなさい。VBで一度やったことがあったと思うんだけど、どっかにいっちゃった・・・

Cだったら、おそらく・・・

< DROPFILESTRUCT構造体 >
typedef struct {
int nSize; // この構造体のサイズ
POINT ptMousePos; //マウスの位置
BOOL fInNonClientArea;//マウスが非クライアント領域の時,TRUE
BOOL fUnicode; //パス名がUnicodeの時, TRUE
} DROPFILESTRUCT, *LPDROPFILESTRUCT;
(1)GlobalAllocでメモリーをキープHDROP型に変換

(2)PostMessage(hTarget, WM_DROPFILES, hDro...続きを読む

QVC#でドラッグアンドドロップ時のカーソルの制御

プログラミング初心者です。
ファイル管理ソフトを作りたいなと、種々の言語を比較した結果VC#が一番やりやすいかなと思い、基礎知識もなくvisual studioをインストールしてあれこれ試行錯誤しながら、メニューやボタンやリストビューを作るところまでは行きました。ドラッグアンドドロップ機能を付けたいと思い、色々と検索してドラッグアンドドロップでlistView1に特定の拡張子のファイルを入れる下記のコードは見つかりました。さらに、特定の拡張子(ここでは.txt)以外のファイルをドラッグしてlistView1の領域に入った時、カーソルを禁止のマークに変えたいのですがそのコードがわかりません。ご教授いただければと存じます。

// もちろん基礎知識も平行して勉強しているところです。

// 下記のlistView1_DragEnterイベントハンドラ内に
// if(ドラッグしたファイルの拡張子が.txt以外だったら){Cursor.Current = Cursors.No;}
// とすると思い色々試したのですがうまくいきませんでした。(素人の試行錯誤なので提示できません)

private void listView1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Link;
}
}

private void listView1_DragDrop(object sender, DragEventArgs e)
{
string[] handles = (string[])e.Data.GetData(DataFormats.FileDrop, false);
foreach (string s in handles)
{
if (File.Exists(s))
{
if (string.Compare(Path.GetExtension(s), ".txt", true) == 0)
{
AddFileToListview(s);
}
}
else if (Directory.Exists(s))
{
DirectoryInfo di = new DirectoryInfo(s);
FileInfo[] files = di.GetFiles("*.txt");
foreach (FileInfo file in files)
AddFileToListview(file.FullName);
}
}
}

private void AddFileToListview(string fullFilePath)
{
if (!File.Exists(fullFilePath))
return;
string fileName = Path.GetFileNameWithoutExtension(fullFilePath);
string dirName = Path.GetDirectoryName(fullFilePath);
if (dirName.EndsWith(Convert.ToString(Path.DirectorySeparatorChar)))
dirName = dirName.Substring(0, dirName.Length - 1); //hack off the trailing \
ListViewItem itm = listView1.Items.Add(fileName);
itm.SubItems.Add(dirName); //second column = path
}

プログラミング初心者です。
ファイル管理ソフトを作りたいなと、種々の言語を比較した結果VC#が一番やりやすいかなと思い、基礎知識もなくvisual studioをインストールしてあれこれ試行錯誤しながら、メニューやボタンやリストビューを作るところまでは行きました。ドラッグアンドドロップ機能を付けたいと思い、色々と検索してドラッグアンドドロップでlistView1に特定の拡張子のファイルを入れる下記のコードは見つかりました。さらに、特定の拡張子(ここでは.txt)以外のファイルをドラッグしてlistView1の領...続きを読む

Aベストアンサー

惜しいです。
DragEnterではLinkを設定あともループを続けると,最後の物のみが有効になってしまいます。
対策としては,最初に見つかったらそのままreturnのが簡単です。

# 見た目上の対策として,U+0020二つをU+3000に置き換えています。使用時は逆変換して下さい。
private void listView1_DragEnter(object sender, DragEventArgs e)
{
 string[] fileName = (string[])e.Data.GetData(DataFormats.FileDrop, false);
 foreach (string s in fileName)
 {
  if (File.Exists(s))
  {
   if (string.Compare(Path.GetExtension(s), ".txt", true) == 0)
   {
    e.Effect = DragDropEffects.Link;
    return; // 後で処理する物があったらLinkを設定して終わり。
   }
  }
  else if (Directory.Exists(s))
  {
   if (Directory.GetFiles(s, "*.txt").Length > 0) // DirectoryInfoを持ち出さなくてもOKで,条件は「存在すれば」なのでループで回さず,Lengthのみを見ている
   {
    e.Effect = DragDropEffects.Link;
    return; // 後で処理する物があったらLinkを設定して終わり。
   }
  }
 }
 e.Effect = DragDropEffects.None;
}

惜しいです。
DragEnterではLinkを設定あともループを続けると,最後の物のみが有効になってしまいます。
対策としては,最初に見つかったらそのままreturnのが簡単です。

# 見た目上の対策として,U+0020二つをU+3000に置き換えています。使用時は逆変換して下さい。
private void listView1_DragEnter(object sender, DragEventArgs e)
{
 string[] fileName = (string[])e.Data.GetData(DataFormats.FileDrop, false);
 foreach (string s in fileName)
 {
  if (File.Exists(s))
  {
   if (string...続きを読む

Q複数コントロール(ラベル)を選択し、ドラッグアンドドロップする方法

W2K、VB6でタイトルの機能を作りたいです。
イメージはVBのフォームデザインです。今回は単純にラベルのみです。
ラベル一つなら、簡単ですが、複数となるといくつ試してみたが全然うまくできなかった。ご存知の方、是非教えて下さい。
宜しくお願いします。

Aベストアンサー

移動開始→MouseDown
 ※現在のMouseのXY座標取得し変数にセット
 ※各移動対象オブジェクトの現在座標を変数にセット
 ※モジュール内フラグ変数 = TRUE

移動中→MouseMove(モジュール内フラグ変数=TRUE時)
 ※MouseのXYの取得
 ※移動開始時のマウス座標と現在のマウス座標の移動ベクトル量(差分)を取得
 ※各移動対象オブジェクトの取得してあった座標にその差分を反映

移動終了→MouseUp
 モジュール内フラグ変数=FALSE

という処理だと思うのですが、1つでも複数でも処理の違いがないように思うのは私だけ?1つならうまくいったのですよね?
何に詰まったのか、よくわかりません。

Qドラッグアンドドロップでファイルを読み込む方法を教えて下さい。

一応いま手元にあるのはVB.NET2003なのですが、
これを使って複数のファイルから指定した行の内容をコピーして出力するプログラムを作りたいと考えています。
そのためには
1.ファイルをドラッグアンドドロップしてファイルの内容を読み込む
2.読み込んだ内容を順番に出力する機能が必要になります。

それでドラッグアンドドロップによりファイルを読み込む記述を探しているのですが、
http://www.atmarkit.co.jp/fdotnet/dotnettips/676dragdrop/dragdrop.html
ここにあるように、
1.フォームのAllowDropプロパティをTrueに設定する
2.フォームのDragEnterイベント・ハンドラを記述する
3.フォームのDragDropイベント・ハンドラを記述する
ということを順番に行えば良いわけですが、1番はもちろん分かりますが、2番と3番がどうして良いのか分かりません。
本屋で一通りVBの本を見てみたのですが、どの本にもドラッグアンドドロップについて書かれてある本はありませんでした。
検索などすると、確かにDragEnter、DragDropに関する記述は見つかるのですが、難しくてどうしても理解出来ません。

どなたか易しく教えて頂けないでしょうか?
よろしくお願い致します。

一応いま手元にあるのはVB.NET2003なのですが、
これを使って複数のファイルから指定した行の内容をコピーして出力するプログラムを作りたいと考えています。
そのためには
1.ファイルをドラッグアンドドロップしてファイルの内容を読み込む
2.読み込んだ内容を順番に出力する機能が必要になります。

それでドラッグアンドドロップによりファイルを読み込む記述を探しているのですが、
http://www.atmarkit.co.jp/fdotnet/dotnettips/676dragdrop/dragdrop.html
ここにあるように、
1.フォームのA...続きを読む

Aベストアンサー

この辺りが参考になるかと

[ファイルをドラッグアンドドロップする ]
http://anetm.com/dev/tools/vbdotnet/112236.htm
[ドラッグアンドドロップでファイルを関連付けでオープンする]
http://anetm.com/dev/tools/vbdotnet/112285.htm
[ドラッグアンドドロップでEXCELシートの一覧を取得する]
http://anetm.com/dev/tools/vbdotnet/112288.htm


人気Q&Aランキング

おすすめ情報