- ベストアンサー
エクセルでマウス指定したセルの一部を取り込む方法
- エクセルで特定のセルから部分的な内容を取り出す方法について質問があります。
- 現在はセルを開いて該当文字列を選択し、Ctrl+cでコピーし、クリップボード経由で変数に取り込んでいますが、操作がやや複雑です。
- VBAを使用してセルの一部を直接取り込む方法や、他の取り込み方法についてのアドバイスをいただきたいです。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
細かな説明を省いてしまいました。すみません。 > 数字キーを押すと、そのまま入力されてしまいます。 > Ctrlキーと一緒に押すと書式指定ダイアログが出てしまいます。 最初にマクロ SetCustomShortcut を実行して下さい。 Application.OnKey はショートカットを割り当てる命令です。 マクロ SetCustomShortcut でテンキーではない数字キー1~9にそれぞれ ショートカットを割り当てています。Ctrl の同時押しは必要はありません。 アクティブセルのデータが " IU0030.DTX02 = OA0055.DTX02; " のとき 1 キーを押すと、 IU0030.DTX02 が MsgBox で表示され、2 キーを押すと OA0055.DTX02; が表示されます。要するに = で要素を区切った場合、何番目を取り出すの かを数字キーひとつで指定できる...ということです。要素が2~3程度の 場合、操作性の点で言えばマウスを併用するよりも、この方が高速オペレー ションできるはずです。 今は MsgBox で表示してますが、コードを修正すればいかようにもデータ 加工できますよね? MsgBox の Trim$(vBuf(Num - 1)) を検索プロシージャに引数で渡せばよろ しいかと思います。 なお、設定したショートカットを元に戻すには、マクロ RestoreShortcut を実行します。
その他の回答 (6)
- KenKen_SP
- ベストアンサー率62% (785/1258)
ろくに #4 の補足とか読んでなかったので、勢いで #6 を回答しましたが... 意図を理解した上で、改めて別提案。こんな仕組みはどうですか? この手の問題は、ワークシート上で何とかしようとすると大変なんです。 そこでユーザーフォームを使います。ご希望にかなり近いと思いますよ。 【手 順】 1. VBE で[挿入]-[ユーザーフォーム] 2. フォームにテキストボックスを適当に一つ配置 3. フォームの ShowModal プロパティーを False にする 4. 下記ソースコードをコピペ 5. 後はフォームを起動するだけ セルを選択すると、そのセルの内容がテキストボックスにリアルタイムで 反映されます。そのテキストボックス内で検索したい語をドラッグする.. か、またはキーボードで選択して Enter ...といった感じですね。 検索部については解決済みとのことなので省略しました。 Option Explicit Private WithEvents xlApp As Application ' // このプロシージャでキーワード表示 Private Sub GetKeyword() Dim sKey As String sKey = Trim$(TextBox1.SelText) If Len(sKey) > 0 Then ' ここで変数 sKey の内容を検索プロシージャに渡す MsgBox sKey, vbInformation, "( ・∀・)Get!" End If End Sub Private Sub TextBox1_MouseUp( _ ByVal Button As Integer, ByVal Shift As Integer, _ ByVal X As Single, ByVal Y As Single) ' Drag --> Left Button Up でキーワード表示 If Button = xlPrimaryButton Then Call GetKeyword End Sub Private Sub TextBox1_KeyDown( _ ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) ' Enter キーでもキーワード表示 If KeyCode = 13 Then Call GetKeyword End Sub Private Sub UserForm_Initialize() On Error Resume Next Set xlApp = Application With Me .StartUpPosition = 0 'Manual .Top = xlApp.Top .Left = xlApp.Left .Width = xlApp.Width .Height = 60 End With With TextBox1 .Top = 5 .Left = 5 .Width = Me.InsideWidth - 10 .Height = Me.InsideHeight - 10 .Font.Name = "MS ゴシック" .Font.Size = 16 End With Me.TextBox1.Text = Trim$(ActiveCell.Text) End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Set xlApp = Nothing End Sub ' // Application レベルのイベント Private Sub xlApp_SheetSelectionChange( _ ByVal Sh As Object, ByVal Target As Range) On Error Resume Next TextBox1.Text = Trim$(Target.Cells(1).Text) End Sub
お礼
またまた回答ありがとうございました。 No.6の補足で「 ・∀・」の入力が分からないと書いてしまいましたが、AscWでコード値が分かりましたのでOKです。 12539 8704 12539
- KenKen_SP
- ベストアンサー率62% (785/1258)
妥協案で、データのあるセル上で数字の 1,2,3...キーを押します テンキーではありませんよ。 # ちなみにセル編集中にマクロを動かすことは、非常に制限が多いですけど # 一応可能です。かなりトリッキーですが... Option Explicit Sub SetCustomShortcut() Dim i As Long For i = 1 To 9 Application.OnKey CStr(i), "'GetValue " & CStr(i) & "'" Next i End Sub Sub RestoreShortcut() Dim i As Long For i = 1 To 9 Application.OnKey CStr(i) Next i End Sub Sub GetValue(ByVal Num As Long) Const DELIMITER = "=" Dim sVal As String Dim vBuf As Variant On Error Resume Next sVal = ActiveCell.Text If InStr(sVal, DELIMITER) > 0 Then vBuf = Split(sVal, DELIMITER) If vBuf(Num - 1) <> "" Then MsgBox Trim$(vBuf(Num - 1)), , "( ・∀・)Get!" End If End If End Sub
補足
回答ありがとうございます。 試してみましたが、私のやり方が不味いのでしょうか。うまく行きません。 数字キーを押すと、そのまま入力されてしまいます。 Ctrlキーと一緒に押すと書式指定ダイアログが出てしまいます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。Wendy02です。 最初に、 こちらの回答者側としては、全体の状態がまったくみえないので、Excelをどのように使っていらっしゃるか分かりません。 「文字列の解析などのVBA記述は心得ております。」とおっしゃっているのなら、もう少し、プログラマブルに全体を考え直したほうがよいです。正直なところ、何か、Excel の基本的な機能の知識に疑問を持ってしまいました。 セルをオープンすること自体は、「入力待ち」状態になって、Excelの機能が停止している状態です。セルをオープンした状態では、何も使えません。Wordのように、センテンスや単語という単位は存在していません。ある種の規則を以って切り分けるしかありません。 >セル内のどのワードを選択するかをマウスによって指定したいのですが・・・ >ワードが2つの場合の例をあげましたが、ワードの数は不定です。 現実問題として、そのような作業で、マウスで単語選択でしたら、最初から、Excelを使わないほうが早いです。たぶん、Wordで出来るかもしれませんが、たぶん、ほとんどのテキストエディタでも、センテンスに対する単語の選択をする機能があるはずです。
補足
言葉足らずで申し訳ありません。 メインフレームのPL/Iソースプログラムの解析を行っています。 PL/Iソースをエクセルに落とし込むツールがあり、エクセルで調べるのが一番効率的な環境におります。 例えば以下のようなエリア定義があったとします。 DCL 01 IPAREA, 02 GROUP1, 03 AAA BIT(16), 03 BBB BIT(4), 02 GROUP2, 03 AAA FIXED DEC(5), 03 BBB PTR; これに対して、以下の命令があったとします。 CALL(IPAREA.GROUP2.AAA, W@XYZ.ABC, OPAREA.XYZ); 各行が1つのセルに入っています。 " CALL(IPAREA.GROUP2.AAA, W@XYZ.ABC, OPAREA.XYZ); "を選んだ場合、「IPAREA.GROUP2.AAA」か「W@XYZ.ABC」か「OPAREA.XYZ」のどれを検索するかVBAに教えてやらねばなりません。 この方法を模索しています。 現在はセルを開け、該当文字列を選択し、Ctrl+cでコピーし、セルを閉じ、ショートカットキー(Ctrl+aを割り当てている)を押してVBAを実行しています。この操作が煩雑な為、より操作が簡単な方法を探しています。大規模なシステムメンテを行っているので作業量を少しでも減らしたいと思っています。 単純にこの文字列で検索するのではなく、要素に分け、PL/Iの文法に沿って正しい場所を見つけなけらばなりません。 例えば「IPAREA.GROUP2.AAA」で検索した場合、要素は「IPAREA」「GROUP2」「AAA」の3つになり、検索結果は以下のようになります。 DCL 01 IPAREA, 02 GROUP1, 03 AAA BIT(16), 03 BBB BIT(4), 02 GROUP2, 03 AAA FIXED DEC(5), <=このセルが選択される 03 BBB PTR; この検索については解決済みです。 コンパイルシートのクロスリファレンスを見れば分かることですが、紙ベースの資料を見るのは大変ですし、リソースの制約から自由にコンパイルできない環境です。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >Ctrl+cでコピーし、クリップボード経由で変数に取り込んでいますが、操作がやや複雑です。 クリップボード・オブジェクトから、取り出しているのですか?? クリップボード・オブジェクトを使いこなせるなら、本来は、必要ないように思いますが。 本当は、どのようなコードを組んでいるか見せていただいたほうがよいです。 ワークシートのセル上では、ワンクリック・イベントがありませんので、ダブルクリックイベントが用いられます。つまり、ワンクリックだと、セルをセレクトしているのか、どちらか分からなくなってしまうからでしょう。 'シートモジュール Private Buf As Variant Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim myVal As Variant Const MYINDEX As Integer = 1 'インデックスの数(0~) If IsEmpty(Target.Value) And Buf = Empty Then Exit Sub Cancel = True If Buf = Empty Then Buf = Target.Value Beep Else myVal = Split(Buf, "=") If UBound(myVal) > 0 Then myVal = Trim(myVal(MYINDEX)) Else '区切り文字がない場合 myVal = Trim(myVal(0)) End If myVal = Replace(myVal, ";", "") ActiveCell.Value = myVal Buf = Empty End If End Sub
補足
回答ありがとうございます。 試してみましたが、セル全体をセレクトしてしまうようですね。 セル内のどのワードを選択するかをマウスによって指定したいのですが・・・ 最初のクリックでは値が取得できないなど、ちょっと不安定ですね。 ワードが2つの場合の例をあげましたが、ワードの数は不定です。 マウスのクリックによるトリガーだとうまく行かないような気がします。 マウスで位置を指定しておいて、何らか別のトリガー(CTRLキー+任意キーなど)でVBAを実行したいと考えています。 マウスによる指定が困難な場合、割り切って必要なワード数のVBAを別々に作って、それぞれにショートカット(CTRL+1,2,3など)を割り当てて、1番目のワード、2番目のワード、3番目・・と言う具合にやろうかなとも思っています。
- marbin
- ベストアンサー率27% (636/2290)
InStr 関数 も使えますね。
補足
回答ありがとうございます。 "あ"にするか"い"にするかをマウスによって指定する方法をお聞きしています。 InStr 関数はその後のVBAで使用することになりますが、この方法は存じております。
- marbin
- ベストアンサー率27% (636/2290)
"="でSplitしたものの1番目を取得してはいかがでしょう? なお あ=い の場合、Splitでは "あ"が0番目、 "い"が1番目になります。
補足
回答ありがとうございます。 "あ"にするか"い"にするかをマウスによって指定する方法をお聞きしています。 "="でSplitはその後のVBAで使用することになりますが、この方法は存じております。
お礼
説明ありがとうございました。 試してみました。 マウスを使うよりこちらの方が早いと思います。 素晴らしいマクロ、本当にありがとうございます。
補足
すいません。以下の命令の「・∀・」はどうやって入力するのでしょうか? MsgBox Trim$(vBuf(Num - 1)), , "( ・∀・)Get!" 自宅ではカット&ペーストでマクロに貼り付けられますが、職場はセキュリティが厳しく、インターネット接続できませんし、USBメモリやFDなど一切接続できないようになっており、キーボードから入力しなければなりません。