• ベストアンサー

Excel2003 VBA ある列の範囲選択(?)

お世話になります。 表題の件で ご相談が御座います。 以前 こちらで「入力された(貼り付けにも対応)数字でもアルファベットでも全角半角問わずに全部半角にする」 という強烈なコードをご教示いただいて便利に使わせていただいていたのですが 自分が余計なお願いをしてしまい(「対象の列を全部」と言ってしまいました) なので全65000行を確認しているのか(?)処理スピードが遅くなってしまいました。。。 ご教示いただいたコードは下記になるのですが Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Column Case 6, 7 Target.Value = StrConv(Target.Value, vbNarrow) End Select End Sub その中で「Case 6, 7」この部分を「F7:F500,G7:G500」このようにしたいと思い 「Range」を付けて「Range("F7:F500", "G7:G500")」としてみましたが 実行時エラー(?)が発生してしまうようで上手く動作してくれません。。。 どのように書き換えたら「F7:F500,G7:G500」この部分だけに反映されるようになるのでしょか? どなたか お分かりになる方ご教示いただけますでしょうか。 宜しくお願い致します。 *ちなみに余談ではありますが「Excelの行」って何で65000行もあるんでしょうね? (65536という数がExcel的には都合がいいということは知っていますが。。) にしても普通そこまで使う前に重くなってブックを分けると思うのですが。。

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

> ちなみに入力されてるデータを「Delete」で消すと実行時エラーのようになるのは何ででしょうか? Deleteしたのは一つのセルではなく複数のセルだったのではないですか? 以前のご質問のとき、一つのセルを対象にするのはこれで、一定の範囲への入力にも対応するのはこっちと2つ回答しておいたと思います。 複数セルのDeleteは、まさに一定の範囲への入力と同じことなのです。 Deleteだけであれば、今度(No3)で記載したコードでエラーは出なくなります。

ookami1969
質問者

お礼

はい! 出なくなりました!! ありがとう御座います!! また 困った時には 宜しくお願い致します!!

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

No1 merlionXXです。 はたと気づいて修正してもどったところ、すでにFEX2053さまからご指摘がありましたね。 一応貼っておきますね(エラーの場合もありえるのでエラーロジックを組み込んであります。) Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Column Case 6, 7 If Target.Row <= 501 And Target.Row >= 7 Then Application.EnableEvents = False On Error GoTo line Target.Value = StrConv(Target.Value, vbNarrow) End If End Select line: Application.EnableEvents = True End Sub

ookami1969
質問者

お礼

完璧です!! ありがとう御座います!!! 断然 早くなりました!! いつもいつもありがとう御座います!!

すると、全ての回答が全文表示されます。
  • FEX2053
  • ベストアンサー率37% (7995/21384)
回答No.2

これって、どのみちワークシート全体の変化を検知して処理してるので 範囲を狭めたからと言って、処理時間は変わらないかと。むしろ、書き 換え時に無限ループに入り込んでいることの方が問題ではないかと思う んですが・・・。 とりあえず、範囲を狭める前に以下のコードを試してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Column Case 6, 7 Application.EnableEvents = False Target.Value = StrConv(Target.Value, vbNarrow) Application.EnableEvents = True End Select End Sub この辺の詳細はこちらを参考にされると良いかと。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html#change Target.Addressで範囲を見ても良いんですが、結局コードが複雑になって 処理時間が延びるだけではないかと思います。

ookami1969
質問者

お礼

ご回答ありがとう御座います! 早いです! すぐにセルが動きます!! >どのみちワークシート全体の変化を検知して処理してるので範囲を狭めたからと言って、処理時間は変わらないかと。 そうなんですか? 範囲を狭めて その範囲だけ検索すれば処理スピードが上がるかと思ったのですが、そうではないのですね? いただいたURLを見て 上記コードを見ると イベントを一旦 停止して 再度 開始するという事なのでしょうか。 それをやると何で処理スピードが上がるのかは理解していないのですが 早くなった事は実感出来ます! ありがとう御座いました!!

すると、全ての回答が全文表示されます。
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

こんにちは、またお会いしましたね。 前回回答した者です。 では一例です。 Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Column Case 6, 7 If Target.Row <= 500 And Target.Row >= 7 Then Target.Value = StrConv(Target.Value, vbNarrow) End If End Select End Sub

ookami1969
質問者

お礼

おぉ! これはこれは! 上記コードの生みの親様ではありませんか! 何度もありがとう御座います! こういう時は「IF~Then」が必要なのですか。 範囲を広げたい時には どこをイジればいいのか分かりやすいです! ありがとう御座います! ちなみに入力されてるデータを「Delete」で消すと実行時エラーのようになるのは何ででしょうか? もしよろしければ再度お願い致しますm(_ _)m

すると、全ての回答が全文表示されます。

関連するQ&A