Excel VBAに関する質問です。


「あるセルをアクティブにしたまま別のセルの内容を貼り付け、アクティブな状態を維持したい」

具体的には以下の手順です。
1. とあるセルに何らかの文字列を入力する。
2. そのセルをアクティブにしたまま別のセル(例えば B1。ここは固定。)に入っている内容を貼りつける。
3. 最初のセルの続きに何か文字列を入力できるようにする。

この 2 の部分を VBA で書き、画面上のボタンに割り当てたマクロとして実行させたいのですが、可能でしょうか?

素人考えでは実行時にセル番地とセル内容を変数に書き込んでおいてからB1をアクティブにし、内容をコピーしてから元のセル内容と繋ぎ合わせ、最後に元のセルをアクティブにするという流れなのですが、どのように書けば良いか分かりません。(もっと簡単に実現できる方法もあるかもしれませんが。)

なおVBAエディタ上で B1 のセル内容を書き込んでおき、マクロ実行によって連結させるということはできません。(Unicode文字なのでVBAエディタが対応していません。VBAエディタでUnicodeが使える方法もあるようですが、今回は除外とします。)

よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2010/11/28 16:23:05
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント100pt

VBAからはセルの値などを直接参照できるので「B1をアクティブにする必要は無い」ですよ

 

B1をアクティブにする必要が無いので、アクティブなセルの番地を変数に入れておくなども不要になり、

アクティブなセルの文字列にセルB1の文字列を継ぎ足したいのであれば下記のような具合になります

ActiveCell.Value = ActiveCell.Value & Range("B1").Value
id:kmyken1

ありがとうございます。私の質問の仕方がまずかったのもありますが、以下のコメント欄に書いておりますように、セルが「アクティブ」な状態ではなく「入力中/入力待ち」の状態で実行したかったのです。ご教示いただいた方法は既に試しましたが動作しませんでした。

同時進行でTwitterの方でもこの件に関してフォロワーの方から教えていただいていたのですが、結局は「入力中」の状態ではマクロを実行できないのでは?というご指摘をいただき、確認してみましたがやはりそういう状況のようです。

質問本文でも記入しましたように、入力中の状態を一旦抜けてからB1をアクティブにして内容を参照し、元のセル内容と結合する、というような方法で実現できそうなのですが、入力中の状態でマクロを実行できないとなると、そこから抜け出すためのマクロも動作しないということになり、頓挫してしまいました。入力待ち状態であることを監視しておくという方法もあるようですが結構大掛かりになってしまいそうで私の能力を超えています。

何かよいアイデアがあればご教示下さい。

2010/11/28 16:14:04
  • id:kmyken1
    質問者です。少々書き方がまずかったかもしれませんので、こちらで補足しておきます。

    Excelではセルが「アクティブ」と「入力待ち」(カーソルが入っている状態)というのは別物のようですが、「アクティブ」ではなく「入力待ち」の状態で上記 2. の処理を行いたいという意味です。(「入力待ち」って何か呼び方がありましたっけ?)

    引き続きよろしくお願いいたします。
  • id:windofjuly
    うぃんど 2010/11/28 13:56:26
    入力待ちにしたい場合は回答1の後で下記を実行することで対応するなどになります
    SendKeys "{F2}"
     
    オプションで「セル内で編集する」にチェックが入っている場合は上記で、セル内での入力待ちとなり、
    チェックが入っていない場合は上記で、数式バーでの入力待ちになります
  • id:spyglass
    このままでは回答出来ないのでご質問になるのですが、
    例えば初期のカーソルが点滅しているセルをA1とします。
    っで、B1の文字をA1へ継ぎ足しするタイミングはどのタイミングでしょうか?
    カーソルが当たった時点ですか?それとも3文字目に移った瞬間ですか?
    VBAはタイミングで実行されます、windofjulyさんのご質問ではタイミングが掴めません。
  • id:kmyken1
    id:windofjuly 様

    ありがとうございます。今回考えておりますのは

    1. 入力中に
    2. 別のセル内容を貼りつけ
    3. 入力を継続する

    という流れですので、ご教示いただいたのは 2. → 3. での処理かと思われます。だんだんはっきりしてきましたが、1. → 2. の段階をどのように解決するかが今回の問題のようです。

    この解決に向けて Twitter の方で別の方から http://www.moug.net/faq/viewtopic.php?t=54853 や http://homepage2.nifty.com/kmado/ke_m10.htm#E02M094 の方法をご教示いただいています。とあるセルがアクティブになったことをイベントとして拾ってきて、バックグラウンドで何かを待機させるのであろう、というようなところまでしか理解できず、自分の考えている事例にどのように当てはめるか、というところまでは残念ながら到達できませんでした。

    このような方法をもっと汎用的に紹介されているコード例などがあれば分かりやすいのかもしれませんが。もし見かけられたら是非ご教示下さい。
  • id:windofjuly
    うぃんど 2010/11/28 14:29:59
    「画面上のボタンに割り当てたマクロとして実行」ということから下記の流れだと判断しましたが、違う点があればご指摘よろしくです
    1. 入力中に画面上のボタンをクリックしてマクロ起動
    2. ActiveCell.Value = ActiveCell.Value & Range("B1").Valueで別のセル内容をアクティブセルの末尾に貼りつけ、
      SendKeys "{F2}"で入力待ち状態に遷移(これによってマクロ下の制御ではなくExcelの制御に戻る)
    3. 入力を継続する
  • id:kmyken1
    id:spyglass 様

    ご質問ありがとうございます。もう少し具体的に書いた方がよいですね。

    今回実装しようとしているのは、ロシア語のアクセント記号付きの文字をセル内容に追記し、そのまま入力を継続するという流れのものです。私自身がロシア語をよく分かっておりませんので、普通のアルファベットを使ってご説明しますと、

    1. セルA1にabcと手入力する。続く4文字目にUnicodeで定義されるアクセント記号付きの文字を入力したい。
    2. 入力したい文字はセルB1に入っている(仮にこれをd'とする)。
    3. 4文字目にこのセルB1の内容を追記するため画面上部に配置したボタンをクリックしてマクロを実行させたい。
    4. セル内容は abcd' となった。
    5. そのまま5文字目以降はefgと入力する。
    6. セルを抜け出たら最終的にはA1には abcd'efg と書かれている。

    通常のキーボードからは入力しにくいロシア語のアクセント記号付きの文字を簡単に入力できるようにし、入力時の利便性を高めることが今回のねらいです。上の例でいけば 3. 以降の部分をVBAを使って解決できないか頭を悩ませている次第です。

    何か解決方法があるようでしたら是非ともご教示下さい。
  • id:kmyken1
    id:windofjuly 様

    ありがとうございます。

    ご教示いただいた方法も試してみましたが、どうも「入力中に画面上のボタンをクリックしてマクロ起動」の部分がうまく動作しないようです。

    やはりボタンに割り付けたマクロであっても入力中には動作しないように思われますが、いかがでしょうか?



  • id:windofjuly
    うぃんど 2010/11/28 14:42:57
    そうですね。こちらの誤認です。入力中はダメですね
    考えなおしてきます
  • id:kmyken1
    id:windofjuly 様

    ありがとうございます。何かアイデアがありましたら是非お寄せ下さい。

    もちろんこのままスルーしていただいても結構ですので。
  • id:windofjuly
    うぃんど 2010/11/28 14:52:11
    半分ネタ的で恐縮ですが、
    連続して入力するのであればロシア語入力を導入する
    http://www.l.u-tokyo.ac.jp/~slav/wrusindex.html
     
    むりやりにでもVBAから制御できないかは引き続き検討してみます
  • id:kmyken1
    id:windofjuly 様

    今回のプロジェクトはロシア語教育が専門の方と共同で進めているもので、当然ながらロシア語の入力環境は導入されています。

    それでもアクセント記号付きの母音文字の入力には苦労されているとのことです。どの程度の苦労なのかがよく分かりませんが、Excel上ではわざわざ別のセルに入っている文字をコピーして、必要なところに貼り付けるとおっしゃっていました。そこまで面倒な作業であれば何とかVBAなどを駆使して簡単にできないものか、と思いながらやって見ているところなのですが、なかなかうまく行きません。
  • id:kmyken1
    id:makiyamakoji 様

    ブコメ欄でのご指摘ありがとうございます。

    今のところ「入力中にマクロの実行ができない」という問題にぶつかっているところです。ご教示いただいた方法もその段階に行き当たる前のところで動作しないため、実現できないものと思われます。

    何かよいアイデアがありましたらご教示下さい。
  • id:spyglass
    ちょっと調べてみたのですがカーソル点滅中エクセルは全機能を停止してIMEからの文字列の入力を待っている状態になる様です・・・
    となるとこの時点でVBAの実行は不可になりますね。

    ただ逆を言うと入力する前に事前にB1の文字をコピーしておき、A1セル入力中にCTRL+Vで「継ぎ足し貼り付け」は可能の様です。
    ロシア語のそのアクセント記号はB1固定でなく色々と複合して接続されるのでしょうか?
    先ほどの私の案では一文字(Windows上)が限界です。


  • id:kmyken1
    id:spyglass 様

    > ちょっと調べてみたのですがカーソル点滅中エクセルは全機能を停止してIMEからの文字列の入力を待っている状態になる様です・・・

    そうなんですか!これは新しい発見です。

    ロシア語がご専門の方から伺っている範囲では、アクセント記号付きで入力しにくい文字が19文字ほどあって、これらを何とか簡単に入力できないものか?ということでした。単語中で使われる特定のアクセント記号付き文字を予めクリップボードに書き込んでおいて、というのはちょっと現実的な解決方法じゃないですよね。

    他のユーティリティソフトを使えば実現できるのかもしれませんが、Excelだけで自己解決するのは難しいようですね。

    ありがとうございました。
  • id:Mook
    用途を見た限りそこまで即時性が必要なものかちょっと気になりました。
    入力中は代替文字を入力しておいて、確定時にそれをおきかえる処理で十分じゃないでしょうか。

    自分で
    [e = д
    [E = й
    などと対応を決めておき、
     G[epaBCTBY[ETe!
    のように入力したら
     Здравствуйте!
    のように。

    ネットで探せばこんなのも見つかりました。
    http://www.vector.co.jp/soft/dl/win95/business/se362206.html
  • id:kmyken1
    id:Mook 様 
    id:windofjuly 様

    コメントありがとうございます。入力の即時性についてはいろいろと専門家の方々も苦労されているようです。確かに代替文字を使ってあとで置換するという方法もありますが、できることならその場ですぐに入力したい、というご要望があるようです。

    Excelでイベントを拾うという手法についてはまだ十分理解できていませんので、今後勉強してみます。今回の案件以外でも活用できる場面があるかもしれませんので。

    なお、id:Mook 様にご教示いただいたキリル文字入力エクセルシートは残念ながらアクセント記号付きの文字には対応していないようです。
  • id:Mook
    入力をユーザフォームにすることは可能でしょうか。
    キリル文字シートのように、入力内容をユーザフォームに読み込み、入れたい文字をボタンなどから
    入力して、セルにコピーバックするのであれば、基本はキリルシートのやり方でできそうです。

    ユーザフォームを使用するもう一つのメリットは、キーイベントを取得できるので、キーコードを決めておけば、IME のように任意の文字を置き換えて入力することができます。

    ただ、今回あまりマクロ内(ユーザフォームを含む)に文字コードを持ちたくないようであれば、
    今回の案は没ですね。

    却って混乱させただけのようで、失礼しました。
  • id:kmyken1
    ご回答およびコメントをお寄せいただきました皆様、どうもありがとうございました。

    結果的にExcelでは通常は実現不可能な内容をお尋ねしていたようです。私自身もいろいろ誤解していたところがあったようですが、皆様のお知恵を拝借でき、新たな発見もいろいろとありました。大変有意義でした。

    これにて回答受付を終了いたしますが、コメント欄は引き続き時々参照させていただきます。

    今後ともご縁がありましたらよろしくお願いいたします。

    なお、回答は1件のみでしたが、コメント欄に書き込みをいただいた皆様にもささやかながらポイント送信をしておきますので、お納め下さい。
  • id:kmyken1
    id:Mook様

    ユーザーフォームを使うという方法もありますね!
    大変参考になりました。ありがとうございます。
  • id:Mook
    お気遣いありがとうございました。
    もう少し仕様が固まれば回答をと思っていましたが、問題の解決をお祈りいたします。
  • id:Silvanus
    もし差し支えなければ、その困っていらっしゃる方にお願いして
    アクセント付きのロシア文字がセルに貼り込まれた
    Excelのワークシートをウェブ上のどこかへ挙げていただけませんか。私が
    思いますに、AutoHotkeyとかDvorakJとかを使用すれば何とかなると思うのですが…。
    VBA for Excelでは、入力中のイベントをトラップするのはやっぱり無理だと思います。
  • id:kmyken1
    id:Silvanus 様

    ご提案ありがとうございます。
    入力したい文字は以下の19個ですが、残念ながら外部ソフトは利用できないという条件です。
    а́  ы́  у́  э́  о́  я́  и́  ю́  е́  ё  А́  У́  Э́  О́  Я́  И́  Ю́  Е́  Ё

    今回の件は主に教室に設置のパソコンや貸出用のノートパソコンなどを使って授業される時の利用を想定されているのですが、外部ソフトの導入は個人のパソコンならともかく、共用パソコンですから不可能ということらしいのです。Excel VBAのようにオフラインのローカル環境だけで、外部ソフトを導入せずに実現可能というのが理想だそうです。

    オンラインキーボードもあるのですが、オフラインの時は使えませんし。
    何かと障害が多いものですね。
  • id:Silvanus
    外部ソフトは不可ですか…。もう一点だけ教えて下さい。Excel(Office)のバージョンは?
  • id:kmyken1
    id:Silvanus 様

    お尋ねありがとうございます。Office XPと2007利用者の両方が関与しているのがまたややこしいところです。

    どうかご無理のない範囲で、何かアイデアがありましたらお寄せいただけましたら幸いです。

    ご遠慮なくこのままスルーしていただいても結構ですので。
  • id:taknt
    入力中に 入力文字を別の文字に置き換えるのは 簡単です。
    マクロなんて必要ありません。

    オートコレクトを 使えばいいだけです。

    ためしに セルに (c)と 入力してみてください。
    これが 変換されるはずです。
  • id:kmyken1
    id:taknt 様

    コメントありがとうございます。オートコレクトを使うというのは考えていませんでした。目から鱗です!

    しかしこれは個人レベルでの改善に過ぎませんよね?そうではなく日本語のWindows環境でロシア語に関わる皆さんが楽できる方法を模索しているつもりです。(ちょっとでかすぎる目標設定ですが、ひとまずは「日本ロシア語教育研究会」という所での発表ネタとして考えているレベルの話です。)

    ところでオートコレクトの設定はどこに保存されるのでしょうか?あまり詳しくありませんが、Wordで言うところのNormal.dotのような部分に書かれていて、もし仮にこの設定内容だけを多くの方が一括して上書きできるような形で配布できるのであれば、この方法が一番優れているのかもしれませんね。

    ご存知でしたらご教示いただけましたら幸いです。
  • id:Silvanus
    今望まれている様な作業にオートコレクトを利用するのは
    ちょっと無理があるのではないでしょうか。
    オートコレクトは単語単位での置換しかできず
    文字単位での置換は行えないため、
    例えば"aac"を"а́"へ自動修正する様に登録した場合に
    "AAAа́BBB"という単語を打ち込もうと思うと、
    "AAA(スペース)aac(スペース)"と打ち込んだ時点で
    "AAA(スペース)а́(スペース)"と自動修正されるので、
    スペース2箇所を削除し"AAAа́"とした後で、続いて"BBB"とタイプすることになります。
    それでも良いのであれば、[ファイル]-[オプション]-[文章校正]-
    [オートコレクトのオプション]-[オートコレクト]-[入力中に自動修正する]の
    リストを編集すればOKです。
    当方のPC上のMS-Office 2010では、オートコレクトリストの保存ファイルは
    以下の2ファイルでした。
    x:\Documents and Settings\xxxxx\Application Data\Microsoft\Officeの中の
    MSO0217.acl, MSO1033.acl
    拡張子".acl"が"AutoCorrect List File"として定義されているようです。
  • id:kmyken1
    id:Silvanus 様

    コメントありがとうございます。

    あとで試してみようかな?と思っている作業を先取りしてくださり、とても助かりました。

    なるほど、オートコレクトにはそういう問題もあるのですね。かなり希望の光が見えてきたような気がしましたが、やや早計だったようです。でもAutoCorrect List Fileというものが存在していることも新しい発見でした。これはこれでうまく使えそうな場面が見つかるかもしれませんね。

    ありがとうございました。
  • id:Silvanus
    コメントを改めて読み直してみましたが、
    Mookさんの2010-11-28 15:38:11のコメントが一番現実的な様に思いますけど
    いかがでしょうか。即時的に入力されたいというご要望は勿論理解できますが
    一つのセルの入力の間我慢して、入力終了時のEnterキー押下と同時に
    変換される様にするのであれば、普通にマクロで組めますしね。
  • id:kmyken1
    皆さんにご提案いただいたオートコレクトとイベントを拾うVBAを組み合わせれば、ひょっとするとうまくいくのでは?という気がしてきました。ちょっと私のスキルが足りないので、今すぐ試してみることはできないのが残念ですが。

    アクセント符号付きの文字の前後にスペースを空けて予め決めた置換のための文字列を入力し、オートコレクトによって必要とする文字に置き換えた上で、前後のスペースはVBAでイベントを拾って自動削除する。ひょっとするとこれ、良い方法かもしれませんね。

    オートコレクトの設定ファイルが自由に配布できて、各ユーザーの設定ファイルに上書きができるということが前提となってしまいますが。(今度はどうもこのあたりが怪しく思えてきましたが…。)
  • id:taknt
    オートコレクトの設定の仕方次第では 単語単位というのを 回避できます。

    たとえば .e.を ёなどに 置換という設定にすれば

    a.e.と入力しただけで aёとなります。

    この性質を利用して うまく設定すれば いいでしょう。
    といっても 19個は 大変ですけどね。
  • id:Silvanus
    連コメ済みません。
    > ちょっと調べてみたのですがカーソル点滅中エクセルは全機能を停止してIMEからの文字列の入力を待っている状態になる様です・・・
    Excelのメニューの全てが無効化される訳ではなくて、特殊文字の入力や、ウィンドウの整列等の幾つかのメニューは有効になってます。
    ユーザー作成のマクロをリボンに登録して、何とかテキスト入力中も有効化できないかどうか試しましたがやっぱり無理でした…。
  • id:Silvanus
    >takntさん
    前後をピリオドで挟むっていうのは良いですね!この方法で決まりじゃないですかw。
    ただ、.aclファイルを配布によって、オートコレクトリストが容易に共有できる
    のかどうかが鍵になってきますけど…。
    MSO????.aclの????の部分の数字が他のPCとの間で整合性があるんでしょうかね。
  • id:windofjuly
    うぃんど 2010/11/29 13:21:00
    ロシア語入力環境は整っているということで、
    特別な事を何もしなくて済む方法が無かったかを探っているのですが、
    以下の入力方法で一部もしくは全部の文字入力が可能であることがわかりました
     
    (1)コード番号を打ち込む方法
    Excelのセル内で入力中にaltキーを押しながら6017と入力してaltキーから手を離すとЃが入力されます
    下記はIMEをロシア語に設定した状態で適当に打ち込んで出てきたものです
    今は、このようなコード表がネットのどこかにあるのではないかと探しています
    6017 Ѓ
    6019 ѓ
    6029 Ќ
    6045 ќ
    6049 Ў
    6050 ў
    6056 Ё
    6063 Ї
    6072 ё
    6079 ї
    6089 Й
    6121 й
     
    (2)IMEの文字一覧表を使って打ち込む方法
    「unicode順」に表示させて「ラテン-1補助」を選べば当該の文字が入っていますのでクリックすれば入力されます
    IME2000という古いもののMS明朝やMSゴシックにまで入っていましたので、これが一番環境を選ばない方法かもしれません
     
    以上を既にご存知で面倒だとおっしゃっておられるのだとすれば、このコメントは無視してください
     
    話がロシア語入力の話になってしまったので、私にはこれ以上の追従は難しいと感じていますが、
    そもそもロシアの方々はどのようにして入力しているのでしょうか?
    ロシア語に精通した方ならばロシア人に聞いてもらったほうがいいような気もします
    (ロシア人でもアクセント記号はあまり使わないのかもしれないですが・・・)
  • id:taknt
    >オートコレクトの設定ファイルが自由に配布できて、

    これは VBAで やったらいいです。


    >そもそもロシアの方々はどのようにして入力しているのでしょうか?
    普通にキーボードから入力でしょう。
    http://ptow.juzem.com/archives/2005/03/aaaeaeiexpie.html

    というか キーボード自体が 言語によって違いますからね。

    ひらがなが刻印されている特殊なキーボードなんて 日本だけしか使われてません。
    言語によって 大きく違います。
    中には アルファベットが全部そろっていないロシア語のようなキーボードさえあるのですから。

    というか キーボードをチェンジして 入力したほうが 一般的でしょう。
  • id:kmyken1
    皆様へご報告いたします。

    このコメント欄には登場されませんでしたが、トラックバック元をたどったところで別の議論をして下さっていた id:SALINGER 様が今回私が考えていた方法に最も近いものを再現して下さいました。
    http://d.hatena.ne.jp/SALINGER/20101128#c

    こちらのコメント欄の下の方からSALINGER様に作成していただいたものがダウンロードできるということですが、こちらにもVBAソースコードを転載させていただきます。

    Option Explicit

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Intersect(Target, Range("B1:T1")) Is Nothing Then
    Set myRange = Target
    Else
    myRange.Value = myRange.Value & Target.Value
    myRange.Select
    SendKeys "{F2}"
    End If
    End Sub

    ワークシートのB1:T1にはアクセント記号付きの文字が挿入されており、それ以外の場所が入力中の時にB1:T1のいずれかのセルをクリックすると、そこに割り当てられている文字が元のセルの続きの場所にはめ込まれ、そのまま継続して入力が可能ということになっているようです。(皆様には上記のソースコードそのものをお読みいただく方がすぐにお分かりいただけるかと思います。釈迦に説法、お許し下さい)

    アクセント記号付きの文字を挿入するにはボタンを使わなければならない、と思い込んでいた時点で少々進むべき方向性を間違えていたのかもしれません。

    以上の内容を以て私の質問は解決とさせていただきます。このたびは貴重なお時間を頂戴しての議論、どうもありがとうございました。またこの場をお借りして SALINGER様 には改めて感謝の意をお伝えしたいと存じます。

    なお、VBAを使わない方法についてもいろいろとご議論いただいておりますが、どうぞ引き続きこのコメント欄を使って情報交換を行っていただいて結構です。私も時々参照させていただきます。

    今後もご縁がありましたらどうぞよろしくお願いいたします。
  • id:Silvanus
    じゃ、私はtakntさんの方法に一票を投じておきます。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません