[[20041222093113]] 『マクロでの日本語入力ができない』(Hatch) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロでの日本語入力ができない』(Hatch)
 InputBoxで項目名と条件を入力し、AdvancedFilterで別シートにデータを抽出するマクロを
 作成したのですが、オートシェイプからマクロを実行すると日本語入力ができなくなってしまいます。
 フォームのボタンから実行するとこのようなことはありません。
 (1)皆さんの環境でも再現するのでしょうか?
 (2)原因は何か分かりませんでしょうか?
 ファイルはExcel2002(SP3)、Win Xp Pro(Sp2)で作成したものです。
 日本語入力はATOK17を使用していますが、MS-IMEでも同様と思われます。
 ↓の20.INPUTBOX.xls(約32KB)がそのファイルです。
http://www.geocities.jp/hatch4700/index.html
コードは下のように書いています。 よろしくおねがいします。m(_ _)m
Sub test1()
Dim cr1 As String, cr2 As String, c2r As Range
    cr1 = Application.InputBox(prompt:="項目名を入力しなさい", Default:="性別", Type:=2)
        If cr1 <> "" Then
            Sheets("Sheet1").Range("F1").Value = cr1
        Else
            Exit Sub
        End If
    cr2 = Application.InputBox(prompt:="抽出条件を入力しなさい ", Default:="男", Type:=2)
        If cr2 <> "" Then
            Sheets("Sheet1").Range("F2").Value = cr2
        Else
            Exit Sub
        End If
    Set c2r = Application.InputBox(prompt:="抽出先を選択しなさい ", Default:="Sheet2!A1", Type:=8)
    Application.Goto reference:=c2r, scroll:=False

    Sheets("Sheet1").Range("A1:D300").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("Sheet1").Range("F1:F2"), CopyToRange:=ActiveCell, Unique:=False
    ActiveCell.EntireRow.Delete Shift:=xlUp
End Sub


 貴信拝受、連絡深謝。ご質問頂いた内容には、自分のところに回答してしまいました。
 お手数ですが、そちらを診て頂ければ幸いです。
                           サス

 試しに楕円のシェープに登録してあるマクロを実行しても、おっしゃるような状況が再現しませんね。
 普通に日本語入力出来ます(^_^A;
 WinXP Excel2000,MS-IME2002 です。

 ( ̄0 ̄;アッ インプットボックスの中に日本語入力出来ないってことですね。
 私の方ではボタンの方でも出来ないですね。

 ※ただ、インプットボックスでTYPEを指定してあるので、中に手入力ではなくても
 セル選択でご希望の抽出は出来るようですね。
 直接の原因究明や回答ではなくてm(._.)m ペコッ
 (川野鮎太郎)

 おはようごだいまちゅ
これでどうでしょう??
Option Explicit
Sub test1()
Dim cr1 As String, cr2 As String, c2r As Range
ActiveCell.Select
cr1 = Application.InputBox(prompt:="項目名を入力しなさい", Default:="性別", Type:=2)
        If cr1 <> "" Then
            Sheets("Sheet1").Range("F1").Value = cr1
        Else
            Exit Sub
        End If
    cr2 = Application.InputBox(prompt:="抽出条件を入力しなさい ", Default:="男", Type:=2)
        If cr2 <> "" Then
            Sheets("Sheet1").Range("F2").Value = cr2
        Else
            Exit Sub
        End If
    Set c2r = Application.InputBox(prompt:="抽出先を選択しなさい ", Default:="Sheet2!A1", Type:=8)
    Application.Goto reference:=c2r, scroll:=False

    Sheets("Sheet1").Range("A1:D300").AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=Sheets("Sheet1").Range("F1:F2"), CopyToRange:=ActiveCell, Unique:=False
    ActiveCell.EntireRow.Delete Shift:=xlUp
End Sub
(SoulMan)

 (・0・。) ほほーっ
 セルを一度セレクトすれば良いんだ。_〆\(..;) メモメモ
 さすがManちゃん^^v
 (川野鮎太郎)

 川野鮎太郎さん、SoulManさん 回答ありがとうございます。
 ActiveCell.Select
 を入れると問題ないようですね。 動作の方は確認できました。OKです(^_^)v
 ところで、なぜSelectしていないとダメなのでしょうか?
 分かりやすく解説をしていただければうれしいのですが、
 マクロも基本部分が分かっていないようです。(>_<)
   (Hatch)

 σ(^◇^;)もよくわからなけど、もしも、次の動作が
インプトボックスじゃなかったとしたら、、オートシェイップを選択したままに
なってると思うのね。。だからシートに戻してあげればいいと思うのね。。
ダブルクリックのときセルを選択というかぁ、、カーソルがセルにはいちゃってる時があるでしょ?
Canse=Trueみたいな感じじゃないかな??
この時もσ(^◇^;)はOffset(1).Selectってするときもあるべ(^^;;;
σ(^◇^;)は我流だからエラーを逃れるすべしかしらないけど、、大体こんなことだと
思うんだけど、、どうかな??
v(=∩_∩=)v
(SoulMan)

 この現象(仕様?)を利用して、セルに入力規則の日本語入力[無効]等を設定しておき、
 そのセルを選択してから InputBox を表示さたり、Sendkeysを使ったりしてます。
  (INA)

 SoulManさんの回答で、何となく分かったような気がしていたのですが、
 INAさんの回答で??   
お手数を掛けますが、この現象(仕様?)を説明してもらえませんか?  
   (Hatch)

 オートシェイプをクリックした時点で
オートシェイプが選択状態、このときはテキストの編集にもならないので
日本語入力は無視されます。
然るに、シェイプクリック後、セルを選択した時点で
そのセルに有効になっている日本語入力状況が実行中のマクロに反映されます。
そのようなことだと私は理解しました。
(みやほりん)

 「マクロでInputBoxを使用する際、そこに日本語が入力されないようにしたい」
という要件があるとする。
それの実装手段として以下のように考える。
 
あるセル(入力に普段使わないようなセル…IV1とか)で日本語入力 無効という設定にしておく
↓
マクロ内部でInputBoxを使用する前にそのセルを選択する動きを入れる
↓
日本語入力が不可状態となる
↓
InputBox表示時もその状態が維持されるので期待する動きとなる
 
って事なのかしら。
IME制御はある意味鬼門なので…Excelに制御を任せるとは、うまい手法ですね。
(ご近所PG)

 >うまい手法ですね。
 これを発見して、ほんと重宝してます。 
 ちょっとした活用例を1つ載せておきます。 

 C:\data フォルダにある a から始まるxlsファイルを、
 ダイアログでユーザーに選択させる場合。
   ChDir "C:\data\"
   SendKeys "a*{Enter}"
   Application.GetOpenFilename ("Excel ファイル (*.xls), *.xls")

  このとき日本語入力が ON だと [あ] になってしまいます。
   (INA)


 ActiveCell.Select・・・
 お陰で動くようになりました。
 ありがとうございます。   
 SUS304

 もうちょっとよろしいでしょうか?
 元のコードで、IMEはONの状態でオートシェイプから動かすと、
 1つ目のInputBoxでは日本語入力ができます。
 「OK」をクリックして、
 2つ目のInputBoxでは日本語入力ができません。(直接入力は可能)
 そこで、
 2つ目のInputBoxの前に「ActiveCell.Select」を入れてみたのですが、日本語入力ができません。
 また、E1セルに入力規則で「オン」にしてInputBoxの前に「Range("E1").Select」を入れてみたの
 ですが、日本語入力はできません。
 (ご近所PG)さんの回答の逆をやってみたらうまくいくのかと思い試したのですが、
 うまく動きません。どうしてでしょうか?
    (Hatch)

 落としていぢってみました。
確かにその変だという現象を確認出来ました。
ためしに自分で図形貼り付けて、それにマクロ登録してみたら、
そっちからは普通に動きました。
うーん、何でしょうね?
追記:
訂正。
他の図形を編集状態…□が隅にある状態…にすると、動作した。
それを
 >ためしに自分で図形貼り付けて、それにマクロ登録してみたら、
と誤認。はて…
さらに追記:
 >2つ目のInputBoxの前に「ActiveCell.Select」を入れてみたのですが、日本語入力ができません。
1つ目の前に入れると大丈夫で、2つ目の前だと確かに駄目ですね。
何がどう違うんでしょうね…。
そして追記:
降参。解らん。もう帰る。
(ご近所PG)

 ありゃま、もう終わったのかと思ったらまだだったのね(^^;;;
的外れな回答かもしれませんが、、こんな感じでどでしょう?
Option Explicit
Sub test1()
Dim cr1 As String, cr2 As String, c2r As Range
    cr1 = Application.InputBox(prompt:="項目名を入力しなさい", Default:="性別", Type:=2)
        If cr1 <> "" Then
            Sheets("Sheet1").Range("F1").Value = cr1
        Else
            Exit Sub
        End If
    Sheet1.Select
    cr2 = Application.InputBox(prompt:="抽出条件を入力しなさい ", Default:="男", Type:=2)
        If cr2 <> "" Then
            Sheets("Sheet1").Range("F2").Value = cr2
        Else
            Exit Sub
        End If
    Set c2r = Application.InputBox(prompt:="抽出先を選択しなさい ", Default:="Sheet2!A1", Type:=8)
    Application.Goto reference:=c2r, scroll:=False

    Sheets("Sheet1").Range("A1:D300").AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Sheets("Sheet1").Range("F1:F2"), CopyToRange:=ActiveCell, Unique:=False
    ActiveCell.EntireRow.Delete Shift:=xlUp
End Sub
v(=∩_∩=)v
(SoulMan)

 2回目の前にシートを選択するとうまくいく…なるほど面白い。
なるほど面白い、だけどそれもまたけったいな。

 回避法としては最初にSoulManさんが提示されたように
「最初にセルを選択しておく」という方法で試してみて実際に回避できたので、
動作的には解決してると思います。

 だけど、さて、どーして
1回目の前でSelectするのではOK
で
2回目の前でSelectするのではNG
という現象は何故起こるのかしら、と。
回避法を探すと言うよりは発生の根本的理由が知りたくて
色々いぢくってた感じです。
(ご近所PG)

 σ(^◇^;)が思うに皆さんもよく
Range("A1").Select
と書いてエクセル君に怒られた経験があると思うのですが、、つまりは
一回目のインプットボックスでエクセル君的にはどのシートかわからなくなっちゃたのね。
だから、いきなり
アクチブセル・・っていってもわからないのね。。
だから、シートから順に選択していけばいいのね。。ただ、それだけのことだと思いますよ。
どうでしょ???
それと、一度制御をエクセル君に戻す様な意味もあるようです。。σ(^◇^;)の個人的な見解ですが、、、
シートを選択すれば当然そこにはアクチブセルが一つあるわけでしてぇ。。。
すべったかぁ??
ちなみに、物事には順番がありまして、、
Sheet1.ActiveCell
なんて書くとエクセル君が目をむいて怒りますですはい。。。
ではでは、、
v(=∩_∩=)v
(SoulMan)

 皆さん、お世話になっています。
 Worksheets("Sheet3").Select でもいいし、ご近所PGさんが書かれたように
 別のオートシェイプを選択した状態でも動作するようです。
 と言うことは、何でもいいから選択しておけばよい?
 (SoulManさんが書かれたようにExcelが対象を見失っているのかも)

 また、IMEの日本語が使えないだけで「年齢」「20」のように
 入力すればVBAは動きますので、IMEへの橋渡しがうまくいっていない?
 (IMEに何かの情報が伝わっていないとか・・・)
 (IMEが機能する対象を見失っている・・・)

 「動かすにはどこかを選択しておけばよい」という解決策はあるので、
 余り気にしない方がいいかもしれませんね・・・
    (Hatch)

 >一回目のインプットボックスでエクセル君的にはどのシートかわからなくなっちゃたのね。
 >だから、シートから順に選択していけばいいのね。。ただ、それだけのことだと思いますよ。
んー、一応納得ではあるんですが、
なんでシートを見失うのか、ってのが根本的な謎というか不思議なわけです…
しかも、ボタンからは問題なくて図形からは駄目というのが不思議。
図形がExcelから離れた物だっていうのなら1回目から変になってろと思うけど
なぜか2回目からだし…
 
見失ってるんなら、じゃあ見失わないようにと思って
Applicationを変数に放り込んで見たり、
ThisWorkbook.Applicationとか
Sheets("Sheet1").Applicationとか
からやってみたり、いろいろ試したけど変わらないし。
ま、いっか。
そういうものなのだと言う事で、寝よう。
(ご近所PG)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.