• ベストアンサー

エクセル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

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • エクセルVBAでTransposeの不思議

    MS Officeのエクセル2000です。 下記Sub test01はRange("A1:I1")に文字列を入力し、一旦配列に取り込んでからワークシートに貼り付けるものです。 試験用のコードですので意味はありません。 このコードで255文字まではまったく問題はありません。 ところが、256文字以上の場合、横に貼り付けは問題ないのですが、 Transposeで縦に変換すると型が一致しません。(Error 13)となります。 どうしてでしょうか? 試行錯誤の結果、Sub test02のように一旦横に貼ったデータをコピーしてTransposeして貼り付けるのは大丈夫のようですので不思議でしょがありません。 またこの方法は列数256より要素が多い配列には使えないので解決策にはなりません。 ご教示くださいませ。 Sub test01() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A5").Resize(UBound(myAr, 2)).Value = Application.Transpose(myAr) '256文字の場合エラー End With End Sub Sub test02() Dim myAr As Variant Dim i As Integer, n As Integer n = 256 '文字数 With ActiveSheet .UsedRange.ClearContents For i = 1 To 9 .Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n) Next myAr = .Range("A1:I1").Value .Range("A3").Resize(, UBound(myAr, 2)).Value = myAr .Range("A3").Resize(, UBound(myAr, 2)).Copy .Range("A5").PasteSpecial Paste:=xlValues, Transpose:=True '256文字の場合もOK Application.CutCopyMode = False End With End Sub

  • エクセルVBAで別のファイルの値を代入する記述

    いつもお世話になってます。 エクセル2002で、2つのファイルを使ってVBAを組みたいと考えています。 下記のコードを『ファイルB』に記述しています。 A列のデータを、B列の回数分、C列に表示させています。 このC列に表示させている部分を『ファイルA』に直接書き出すには、 どのような記述が必要なのでしょうか? 単純に『ファイルB』のC列を、『ファイルA』に、コピー&ペーストする方法もあるかと思うのですが、 せっかくなので複数ファイルを対象に処理する記述にチャレンジしています。 が、なかなか思うような結果が得られません。 アドバイスをお願いいたします。 ---------------------- Sub tes1() Dim i As Integer Dim k As Integer Dim x As Integer Dim y As Integer With ActiveSheet.UsedRange lastrow = .Cells(.Count).Row End With x = 2 For i = 2 To lastrow k = Cells(i, 2) For k = 1 To k Cells(x, 3) = Cells(i, 1) x = x + 1 Next k Next i End Sub

  • ExcelにおけるVBAで、データの振り分けをしたい

    Sub a() Dim i As Long Dim s As Long Dim b As Worksheet Dim c As Worksheet Dim maxi As Long Dim maxs As Long Application.ScreenUpdating = False With ThisWorkbook Set b = .Worksheets("bbb") Set c = .Worksheets("ccc") End With maxi = b.Range("A1").CurrentRegion.Rows.Count maxs = c.Range("A1").CurrentRegion.Rows.Count For i = maxi To 2 Step -1 For s = maxs To 2 Step -1 If c.Cells(s, 1) = b.Cells(i, 1) And c.Cells(s, 2) = b.Cells(i, 2) Then c.Cells(s, 14) = b.Cells(i, 3) End If Next s Next i Application.ScreenUpdating = True End Sub ワークシートcとワークシートbの1列目と2列目が一致したときにだけ、cの14列目にbの3列目のデータを代入したく思い、以上のようなコードを書きましたが、重くて終わる様子がありません。 ・そもそもあっているのか、あっていないならどこを修正すればよいか ・早く終わるようにするにはどうしたらいいか アドバイスをよろしくお願いします。

  • ExcelのVBAソースコード(一部)の翻訳

    ソースコードの一部ですが、開発者が他界し訊けずにおります。 今後自分でもVBAを勉強しますが、お教えいただけますでしょうか。 なお冒頭は Function process_new(m0 As Integer, m As Integer, d As Variant, ans As Double) As Integer Dim a(501), b(501), s(501), r(501) As Double Dim w(501), g(11), xx As Double Dim s1 As Double Dim k(501) As Integer Dim i, j, flg As Integer でスタートしています。 =(以下、質問内容)==== s1 = s(k(0)) * 1.618 flg = 0 For i = m0 To m - 3 If Not i = k(0) Then If s1 > s(i) Then flg = flg + 1 End If End If Next i =(以上)====

  • EXCEL VBA

    EXCEL VBAで空白行が現れたら「小計」の文字を入力したいと思い以下のように記述しましたが、うまくいきません。どこがおかしいのか教えてください。 宜しくお願いします。 Sub write小計() Dim i As Integer Dim rowcnt As Integer rowcnt = Cells(1, 1).CurrentRegion.Rows.Count Range("B1").Select For i = 1 To rowcnt If Cells(i, 2).Value = "" Then Value = "小 計" ActiveCell.Offset(1).Select Next i End Sub

  • EXCEL VBA 記号の削除

    A列3行目からはじまる(A列2行目タイトル=FA)データより"!"や"#"などの記号を取り除いた ものをE列に表したいと思っています。 データを半角にして、ASC関数を使って記号を取り除こうとしたのですが、半角になるだけで 記号を取り除くことができません。 If の後、ASC関数は使用せず、"!"や"#"を指定しても結果が同じだったんですが REPLACEの使い方が間違っているのでしょうか? Dim セル As Range Dim TARGET As Range Dim 変換文字 As String Dim i As Long Dim W As Worksheet Set W = Sheets("DATA転記") Set TARGET = W.Range("A3", Range("A65536").End(xlUp)) For Each セル In TARGET 変換文字 = StrConv(セル.Text, vbNarrow) For i = 1 To Len(変換文字) If Asc(変換文字) >= 32 And Asc(変換文字) <= 47 And _ Asc(変換文字) >= 58 And Asc(変換文字) <= 64 And _ Asc(変換文字) >= 91 And Asc(変換文字) <= 96 And _ Asc(変換文字) >= 123 And Asc(変換文字) <= 126 Then _ 変換文字 = WorksheetFunction.Replace(変換文字, i, 1, "") End If Next i セル.Cells(, 5).Value = StrConv(セル.Text, vbWide) Next セル

  • エクセルVBAの繰り返し処理の質問

    C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。

  • 【エクセル】VBAでハイパーリンクそうさ

    VBAでハイパーリンクのマクロを組んでいます。 A列にホームページ名が50行(シートによってまちまち)くらい並んでいて、 B列に、それに対応するURLが記入されています。B列は空白のところがちらほ らあります。 A列に、A列の表示(ホームぺジ名)のまま、B列のURLでハイパーリンクを張りたい です。リンクは貼れたんですが、ホームページ名がどうやれば表示できるかわかり ません。教えてくださいお願いします。 ダメダメですが、一応自分で書けたところまでを載せておきます。 Sub ハイパーリンク() Dim i As Integer Dim j As Integer j = 50 For i = 1 To j Sheets("Sheet1").Select Cells(i , 1).Select ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _ Cells(i , 2), TextToDisplay:="" Next i End Sub としました。

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

専門家に質問してみよう