• ベストアンサー

Excel VBA 漢数字を半角算用数字に変換

cj_moverの回答

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.7

#6、cjです。 #6の補足欄見ました。 ご提示のコードを読み込んで、 「フラ盤」の棋譜データからサンプルを作り、 テストしました。 ご提示のコードで試したところ、 なんのストレスもなく、正しく動作することを確認しました。 現在のコードのままでもいいような気もしていますが、 冗長な感じが気になるのも理解できるところです。 今回の課題は「もっと簡単に」ということでしたから、 持駒の漢数字置換に関連した部分に限って、 簡単にする書き方を提示してみます。 その前にプロシージャの構成を整理しておきます。 ■データ読込・整形  ●棋譜ファイル   ▲盤面     行位置の取得     盤面要素を 出力用フォーマットに置換     最下行位置取得   ▲持駒     行位置の取得     タイトル削除     持駒DATAを配列化     持駒要素の漢数字を半角算用数字へ置換   ▲指手     行位置の取得     最下行から 何手詰めか取得     指手配列を 手数分で再定義     指手要素を 出力用フォーマットに置換 ■データ出力  ●配置DATA  ●持駒  ●正解 ここで示すのは、▲持駒セクションの処理全体です。 構成を変えることで簡単にする可能性が増すので、 セクションごと提示します。 #6補足欄のコードでいうと、   ER = Range("A1").End(xlDown).Row と   C = 1 の間をすべて入れ替えると動くように書いています。 ' ' ・ ' ' ・ ' ' ・ ' ' ER = Range("A1").End(xlDown).Row ' '     ■ ↓ ■   Const 漢数字1_9 = "一二三四五六七八九"  '  宣言部に転記してください   Dim arrS As Variant  '  宣言部に転記してください ' ' 持駒―――――――――――――――――――――――――――――― ' ' 先手の持駒 行位置の取得   MB = Range("A:A").Find(What:="先手の持駒", LookAt:=xlPart).Row ' ' "先手の持駒:" タイトル削除   持駒DATA = Mid$(Cells(MB, "A"), 7) ' ' "十 "を基準に、単独の漢数字'十'を半角算用数字'10'に置換   持駒DATA = Trim$(Replace(持駒DATA & " ", "十 ", "10 ")) ' ' 漢数字'十'を半角算用数字'1'に置換   持駒DATA = Replace(持駒DATA, "十", "1") ' ' 漢数字'一~九'を半角算用数字'1~9'に置換   For N = 1 To 9   ' ' 見つかったものだけを置換する     If InStr(持駒DATA, Mid$(漢数字1_9, N, 1)) > 0 Then 持駒DATA = Replace(持駒DATA, Mid$(漢数字1_9, N, 1), CStr(N))   Next N ' ' Split()関数で持駒DATAを文字列配列に   arrS = Split(" " & 持駒DATA, " ") ' ' 出力用配列 [持駒] に転写   For 行 = 1 To UBound(arrS)     If Len(arrS(行)) = 1 Then arrS(行) = arrS(行) & "1"     持駒(行) = arrS(行)   Next 行 ' '     ■ ↑ ■ ' ' 指手―――――――――――――――――――――――――――――― ' ' C = 1 ' ' ・ ' ' ・ ' ' ・         切り分けてから置換より置換してから切り分ける方が効率いいです。 行位置の取得 の部分はFind メソッドを簡単に書いていますが、 この部分は、ご提示の方法そのままでもいいと思います。 Split()関数はVBAの中でもかなり優秀な関数なので採用しましたが、 Excel2000よりも前のバージョンには用意されていません。 ところどころ、正規表現を使うと簡潔にできる部分もあります。 将来的に検討してみるのもいいと思います。 セル範囲に配列を出力する方法として、 例えば、  v = Array("名前", Date, 980)  Range("A1").Resize(, 3).Value = v のように配列まるごと出力することも可能です。 完結にまとめるには有力な手法ですから、 色々試してみるといいかも知れません。 以上、参考まで。

kana14
質問者

お礼

重ねての丁重な回答をいただきましてありがとうございます

関連するQ&A

  • 算用数字(半角)から漢数字への変換(エクセル2000)

    ワード2000で差し込み印刷をしたいと思っています。 しかし、2000ではエクセルから住所録を読み込む場合、 算用数字を読み込むと横で表示されてしまいます。 そこでエクセル2000で算用数字を漢数字に変換しなければなりません。 算用数字を漢数字に変換するのに簡単な方法はないですか? 私が考えている方法は、1~9の数字を検索して 漢数字に変換していく方法です。 住所の列だけを対象に一括で変換することはできないのでしょうか? 全ての範囲を対象とすると一括変換できるのですが、 郵便番号は算用数字のままでいいので、 変換する必要がないのです。 質問が分かりにくいかもしれないですが、 宜しくお願いします。

  • エクセル2000で、漢数字から算用数字へ変換する関数

    算用数字から漢数字へ変換する関数はあるようですが、その逆の漢数字を算用数字に変換する関数ってありますか? 住所録ですが、 ○○四丁目 ××三丁目 □□2丁目 の表示を、算用数字を用いて統一させたいのですが…、よろしくお願いします。

  • Excel 全角数字を半角数字に

    エクセルを使ってデータを管理しています。 郵便番号の項目には、500件ぐらい郵便番号が入力されていますが、全角数字で入力されたデータと、半角数字で入力されたデータが混じっていて、見辛いし管理もしづらいです。  関数を使って、全角数字を半角数字に変換する方法はありますでしょうか?

  • 漢数字を算用数字に変換したい(緊急)

    いまwordで漢数字を算用数字に変換したくて困っています。 三十五を35にしたいのですが何かいい方法ありませんか? アドバイスお願いします。

  • wordで算用数字を縦書きにしたい

    ワードで縦書きの原稿を書くとき数字は普通漢数字を使いますが、新聞記事などは算用数字が使われていることもたくさんあります。日付などがよい例です。「11月21日」というのをワードで縦書きに入力して変換すると「二十一」とか「二一」のように表記されるくらいです。新聞記事のように算用数字を半角にして「11」と「21」を縦に表記したいのですが、何かよい方法はないでしょうか?

  • 筆まめで漢数字を算用数字に変換出来ますか?

    筆まめでエクセルのデータから、漢数字の住所を算用数字に変換が自動で行えますか? ※OKWAVEより補足:「ソースネクスト株式会社の製品・サービス」についての質問です。

  • エクセルで数字の変換

    エクセル2000です。 ひとつのセルの中に、たとえば「2009年は第1、第5営業部の24名」という文字列があったとします。これを半角一桁の数字のみに限定して全角の数字に変換する方法はないでしょうか? JIS関数だとすべてが全角になってしまいます。 関数でもVBAでもかまいません。 「2009年は第1、第5営業部の24名」と変換したいのです。 対象が何百もあるので困っています。 よろしくお願いします。

  • エクセル 半角変換

    関数で半角に変換するのはどうしたらいいんでしょうか? ASC関数を用いるというのはわかるのですが・・・。 表があってその中に半角と全角が混在している場合に、または 統一性をもたせたい場合においてチェック機能としての役割で 利用したいのですが。 ASC関数ではASC(セル)ですよね。 例えばA1セルに『100』という全角数字があるとすれば B1セルにASC(A1)とすればB1に『100』という半角数字がでますよね。 そうではなくてワードの置換機能のような使い方はどうやるのでしょうか? わかりにくい質問ですみません。

  • Excel2000での算用数値から漢数字への変換

    算用数値から関数値の変換をNUMBERSTRING関数で返した時、123457⇒十二万三千四百五十七 (=NUMBERSTRING(B3,1))などと返されますが、壱弐参四五七このように返される関数などありますか?教えてください。

  • 算用数字の行またがり記述について

    算用数字による複数桁の数値を、行をまたがって記述するのは、一般的に正しいのでしょうか? たとえば、 「あきらさんは、1個50円のみかんを8個、1個2 10円のりんごを5個、買いました。」 という文章表現はゆるされますか?