プロが教えるわが家の防犯対策術!

初めて投稿します。よろしくお願い致します。

Excel上でダブルクリックしたセルの内容を、次のようにしたいと思っています。
ダブルクリックしたフォーカス位置より左側 → 現セルに残す
ダブルクリックしたフォーカス位置より右側 → 右側のセルの値の先頭につける

知りたいことは、アクティブセルのフォーカスの位置(左から何文字目か?)を取得できるものでしょうか?

ご教授頂ければ幸いです。
以上

A 回答 (3件)

#2、cjです。

#2への補足、追加レスです。

ちょっと説明が足りてなかったのですが、

テストする際の要件として、
最初に、シートモジュールにSub 準備()だけを貼り付けて
一度だけ実行します。
それが済んだら、他のプロシージャを貼り付けて、
ブックを保存します。
ここまでが準備、で、
"最初に、シートモジュールにSub 準備()だけを"
という説明が抜けていました。すみません。
    • good
    • 0
この回答へのお礼

回答していただき、ありがとうございます。
サンプルプログラムを改造して、ほぼ思っていたものを作ることができました。
また何かありましたら、宜しくお願いします。

お礼日時:2013/11/22 21:41

こんにちは。



"セルをダブルクリック"というタイミングは、Excel VBA に用意されていますが、
"編集モードで セルに付随した入力領域や数式バー をダブルクリック"というのは、
捉えようがありません。納得いかないかも知れませんが、仕方ないです。
なので、提案になりますが、
 ・事前に(ActiveXコントロールの)テキストボックスコントロールをシート上に配置しておく。
 ・編集したいセルをダブルクリックしたら、直下にテキストボックス(淡い黄色)を再表示し、
  編集したいセルの文字列をテキストボックスの値として表示する。
 ・テキストボックス内で任意の桁位置(文字間)をダブルクリックしたら、
  その桁位置を基準に、そのセルと右隣りのセル(の先頭)とに、文字列を分ける。
 ・テキストボックスをダブルクリックして処理を終えるか、
  セル範囲の選択を変更したら、テキストボックスを非表示に戻す。
という内容を書いてみました。

Worksheet_BeforeDoubleClick イベントを契機にして、
ダブルクリック本来の機能をキャンセルし、代りにテキストボックスを再表示します。
注意点として、直接セル値を編集する場合は、数式バーを使うようにします。
また、処理する範囲を予め限定しておいた方が、他への影響を与えない意味があるので、
例示では、仮に、Range("A2:E31")を対象にしています。
この"A2:E31"の部分を運用に合わせて書き換えるようにしてください。

テストする際の要件として、
・処理対象のシートに既存の(ActiveXコントロールの)テキストボックスコントロール
 が無いことを条件としています。お困りなら相談してください。
・必ず、処理対象のシートモジュールに下記コードを貼り付けてください。
・処理対象のシートモジュールに既存の記述がある場合は、
 プロシージャ名が重複することの無いようにしてください。
・Sub 準備() を最初に一度だけ実行してください。

テキストボックスは様々カスタマイズできます。
応用例として、例えば、セル内改行にも対応させたいとか、横幅を大きくしたいとか、、、
テキストボックスのプロパティを設定変更することで対応可能です。

とりあえず、試してみてください。


' ' 以下、シートモジュール
' ' ===================================

Sub 準備()  '  TextBoxを配置。一度だけ実行し、ブックを保存したら不要。
  With Me.OLEObjects.Add(ClassType:="Forms.TextBox.1")
    MsgBox "TextBoxを追加しました。TextBoxを非表示にします。"
    .Object.BackColor = &HCCFFFF
    .Visible = False
  End With
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If Intersect(Target, Range("A2:E31")) Is Nothing Then Exit Sub
  Cancel = True
  With TextBox1
    .Text = Target(1).Text
    .Top = Target(1).Offset(1).Top
    .Left = Target(1).Offset.Left
    .Visible = True
  End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If TextBox1.Visible Then TextBox1.Visible = False
End Sub

Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  Dim sBuf As String
  Dim nPos As Long
  With TextBox1
    sBuf = .Text
    nPos = .SelStart
    .TopLeftCell.Offset(-1).Value = Left(sBuf, nPos)
    With .TopLeftCell.Offset(-1, 1)
      .Value = Mid(sBuf, nPos + 1) & .Text
    End With
    .Visible = False
  End With
End Sub

' ' ===================================


> 知りたいことは、アクティブセルのフォーカスの位置(左から何文字目か?)を取得できるものでしょうか?
もし、真に文字通りのことをお知りになりたいのでしたら、、、。
"セルをダブルクリック"したタイミングで、
マウスカーソルポジションを取得して、、、というような方法も可能は可能です。
ただ、コマンド待機状態(非編集状態)(セル内にキャレットが無い状態)でダブルクリックというのも、
実用的にはかなり扱いが難しいと思いますし、
上述のように編集モードからはイベントがありませんので、上のような妥協案を挙げました。
マウスカーソルがどのセルの上にあるか、迄は、昔やったことがありますが、
桁位置は経験ありませんし、私は試すつもりがないのです。
人に奨めたりするには、技術的な難度が高くて、検証したり"教授"したりする体力知力を持ち合わせていません。
 excel vba declare getcursorpos pointstoscreenpixels
などで検索してみてください。
セルのフォントサイズや全角半角、等々、細かい調整の部分は、今の処、アイディアが浮かばないので、
マウスカーソルポジションを取得しアクティブセルと座標を合わせるところぐらいまで、
そちらで目途が付いた頃に、また改めて質問してみてはどうでしょうか。

以上です。
    • good
    • 0

ワークシートのBeforeDoubleClickイベントを使用すると、オブジェクト変数Targetにダブルクリックしたセルが格納されます。


http://msdn.microsoft.com/ja-jp/library/ff196564 …

その際に
Target.Addressでセル番地、Target.Columnで列番号、Target.Rowで行番号が返されるかと思います。

例えばD3セルをダブルクリックすると
Msgbox Target.Address で「$D$3」
Msgbox Target.Column で「4」
Msgbox Target.Row で「3」が表示されます。

質問者様のケースの場合Target.Columnで良いかと。。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。
やりたいことは、そのtargetのセル内で編集モードとなっているフォーカスの位置が左から何文字目かを取得したいのです。
説明が不足していてすみません。

お礼日時:2013/11/21 23:55

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