• ベストアンサー

エクセルVBAのコードを簡単に表現したい

お世話になっています。 エクセルVBAでコードを書いたのですが、なにぶん初心者のためゴテゴテしたものになってしまいました。 A列にはA2からA11まで15文字以内の文字列が入っています。 同じ行のB列からP列に、濁点も1文字として1セルに1文字づつ抜き出すようにコードを書きました。 以下です。 Sub test() Dim i As Integer Dim m As Integer Dim s1 As Worksheet Set s1 = Sheets("sheet1") For i = 2 To 11 For m = 1 To 15 変換 = s1.Cells(i, 1) 変換 = StrConv(変換, vbKatakana) 変換 = Application.WorksheetFunction.Asc(変換) 変換 = Mid(変換, m, 1) 変換 = StrConv(変換, vbWide) s1.Cells(i, m + 1) = StrConv(変換, vbHiragana) Next Next End Sub そこで質問なのですが、上記のコードをもっとスマートに表現するとどのようなコードになるのでしょうか。(特に「変換」が連なっているところ) よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 半角を全角にするのは時々やらされます。その時、Excelと他のVBAとの仕様の違いを見せ付けられます。今回は、その逆のようですね。 なお、StrConv関数は、以下のように二つ、つなげられます。 Sub DisassembleString()   Dim i As Long   Dim j As Integer   Dim strText As String   Dim buf As String   With Worksheets("Sheet1")     For i = 2 To 11       If VarType(.Cells(i, 1)) = vbString Then         strText = .Cells(i, 1).Value         buf = StrConv(strText, vbKatakana + vbNarrow)         For j = 1 To Len(buf)           .Cells(i, 1 + j).Value = StrConv(Mid(buf, j, 1), vbHiragana + vbWide)         Next j       End If     Next   End With End Sub

fred2000
質問者

お礼

お礼が遅くなり申し訳ありません。 ただ「+」を使うだけでつなげられるんですね。 知りませんでした。 また質問した際にはよろしくお願いします。 ありがとうございました。

その他の回答 (4)

  • lele00
  • ベストアンサー率29% (74/250)
回答No.5

変換処理も入れてみました。 Sub test() Dim i As Integer Dim m As Integer Dim s1 As Worksheet Set s1 = Sheets("sheet1") For i = 2 To 11 For m = 1 To 15 s1.Cells(i, m + 1) = 色々な変換(Mid(s1.Cells(i, 1), m, 1)) Next Next End Sub Function 色々な変換(変換) 変換 = StrConv(変換, vbKatakana) 変換 = Application.WorksheetFunction.Asc(変換) 変換 = StrConv(変換, vbWide) 色々な変換 = 変換 End Function

fred2000
質問者

お礼

Functionを定義して使うというのは思い付きませんでした。 また質問した際にはよろしくお願いします。 ありがとうございました。

  • lele00
  • ベストアンサー率29% (74/250)
回答No.3

ばらばらにするだけなら、下記のコードで可能だと思うのですが? Sub test() Dim i As Integer Dim m As Integer Dim s1 As Worksheet Set s1 = Sheets("sheet1") For i = 2 To 11 For m = 1 To 15 s1.Cells(i, m + 1) = Mid(s1.Cells(i, 1), m, 1) Next Next End Sub どうでしょうか?

fred2000
質問者

お礼

お礼が遅くなり申し訳ありません。 濁点も1文字とするため、「だ」の場合「た」と「゛」で2つのセルにそれぞれ入力するようにしています。 ありがとうございました。

  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.2

コードの華麗さに拘りたいということで宜しいのでしょうか? まぁ自分に分かりやすければ最初のうちはそれでかまわないと思うのですけどねぇ。示したコードは確かに無駄な処理は多いですが分かりやすいと思いますよ。 全く別のアプローチを考えると例えば 1.文字列を配列にセット  例えばsplit関数で  http://www.moug.net/tech/exvba/0100023.htm 2.文字の中から濁点を探す  文字コードか決め打ちで指定する  http://www.vbasekai.com/tips.html#tips0040  http://park11.wakwak.com/~miko/Excel_Note/15-03_celldata.htm#15-03-54 3.2の判定にあわせて配列を再セット 4.配列を書き出す

fred2000
質問者

お礼

お礼が遅くなり申し訳ありません。 ご紹介いただいたものは私にはまだ難解でした。 ご紹介いただいた方法も序々に勉強していきたいと思います。 ありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

ちょっと修正しただけなので、スマートとも言えないかもしれませんが・・・。 Sub test1() Dim i As Integer Dim m As Integer Dim s1 As Worksheet Dim 変換 As String Set s1 = Sheets("sheet1") For i = 2 To 11 変換 = StrConv(StrConv(s1.Cells(i, 1), vbKatakana), vbNarrow) For m = 1 To Len(変換) s1.Cells(i, m + 1) = StrConv(StrConv(Mid(変換, m, 1), vbWide), vbHiragana) Next Next End Sub

fred2000
質問者

お礼

お礼が遅くなり申し訳ありません。 今までStrConvのネストの仕方が分かりませんでした。 大変参考になりました。 ありがとうございました。

関連するQ&A