- ベストアンサー
エクセル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 そこで質問なのですが、上記のコードをもっとスマートに表現するとどのようなコードになるのでしょうか。(特に「変換」が連なっているところ) よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 半角を全角にするのは時々やらされます。その時、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
その他の回答 (4)
- lele00
- ベストアンサー率29% (74/250)
変換処理も入れてみました。 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
お礼
Functionを定義して使うというのは思い付きませんでした。 また質問した際にはよろしくお願いします。 ありがとうございました。
- lele00
- ベストアンサー率29% (74/250)
ばらばらにするだけなら、下記のコードで可能だと思うのですが? 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 どうでしょうか?
お礼
お礼が遅くなり申し訳ありません。 濁点も1文字とするため、「だ」の場合「た」と「゛」で2つのセルにそれぞれ入力するようにしています。 ありがとうございました。
- popesyu
- ベストアンサー率36% (1782/4883)
コードの華麗さに拘りたいということで宜しいのでしょうか? まぁ自分に分かりやすければ最初のうちはそれでかまわないと思うのですけどねぇ。示したコードは確かに無駄な処理は多いですが分かりやすいと思いますよ。 全く別のアプローチを考えると例えば 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.配列を書き出す
お礼
お礼が遅くなり申し訳ありません。 ご紹介いただいたものは私にはまだ難解でした。 ご紹介いただいた方法も序々に勉強していきたいと思います。 ありがとうございました。
- hana-hana3
- ベストアンサー率31% (4940/15541)
ちょっと修正しただけなので、スマートとも言えないかもしれませんが・・・。 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
お礼
お礼が遅くなり申し訳ありません。 今までStrConvのネストの仕方が分かりませんでした。 大変参考になりました。 ありがとうございました。
お礼
お礼が遅くなり申し訳ありません。 ただ「+」を使うだけでつなげられるんですね。 知りませんでした。 また質問した際にはよろしくお願いします。 ありがとうございました。