• ベストアンサー

Excelで22バイトの文字を数えたい

Excel2002です。 VBAでセルの文字列を取得する時に全角制御文字(2バイト)を含めて22バイトの制限を考慮したいのですがその方法がわかりません。 全角文字だけなら10文字、  半角文字だけなら22文字の取得ができます。 その後の作業の都合上、22バイトを基準に条件判断したいのですが現在はその方法がわからないためLEN()で10を上限としています。LENB()でも同じ結果(文字数が返される)になります。 対象のセルには全角文字/半角文字が混在しており、全角-半角-全角-半角のような混在であれば制御文字を2回考慮する必要があります。 最悪その文字が全角か半角かの区別がつけば対応できると思います。 よい方法をご教授いただきたくお願いいたします。

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

  • ベストアンサー
  • lark_0925
  • ベストアンサー率63% (37/58)
回答No.1

>最悪その文字が全角か半角かの区別がつけば対応できると思います。 ↑これを判断する方法を二つほど・・・。 '========================================================== Sub test()   Dim idx As Long   Dim aa As String   Dim result As String   Range("a1").Value = "私はhungryです"   MsgBox "セルA1の文字列の全角。半角を判断します"   aa = Range("a1").Value   For idx = 1 To Len(aa)    result = "「" & Mid(aa, idx, 1) & "」は、"    If LenB(StrConv(Mid(aa, idx, 1), vbFromUnicode)) = 2 Then      result = result & "全角文字です"    Else      result = result & "半角文字です"      End If    MsgBox result    Next End Sub '========================================================== Sub test2()   Dim idx As Long   Dim aa As String   Dim result As String   Range("a1").Value = "私はhungryです"   MsgBox "セルA1の文字列の全角。半角を判断します"   aa = Range("a1").Value   For idx = 1 To Len(aa)    result = "「" & Mid(aa, idx, 1) & "」は、"    If Evaluate("LenB(""" & Mid(aa, idx, 1) & """)") = 2 Then      result = result & "全角文字です"    Else      result = result & "半角文字です"      End If    MsgBox result    Next End Sub 検討してみてください。

Sinogi
質問者

お礼

LenB(StrConv(Mid(aa, idx, 1), vbFromUnicode)) を利用し以下のような文字列検査で目的を得ました。ありがとうございました。 ※変数"文字列"に検査したい文字列を代入し、本体マクロから"文字列検査"マクロを呼び出し バイト数・ 調整文字 を得て本体に戻ります。 Sub 文字列検査() ReDim 文字長(Len(文字列)) As Integer バイト数 = 0 調整文字 = "" For 文字回数 = 1 To Len(文字列) 文字長(文字回数) = LenB(StrConv(Mid(文字列, 文字回数, 1), vbFromUnicode)) If バイト数 > 0 And 文字長(文字回数) <> 文字長(文字回数 - 1) Then バイト数 = バイト数 + 1 Select Case 文字長(文字回数) Case 1 If バイト数 < 22 Then バイト数 = バイト数 + 文字長(文字回数) 調整文字 = 調整文字 + Mid(文字列, 文字回数, 1) End If Case 2 Select Case バイト数 Case 20 バイト数 = バイト数 + 1 Case 0, 19 バイト数 = バイト数 + 文字長(文字回数) + 1 調整文字 = 調整文字 + Mid(文字列, 文字回数, 1) Case 1 To 18 バイト数 = バイト数 + 文字長(文字回数) 調整文字 = 調整文字 + Mid(文字列, 文字回数, 1) If 文字回数 = Len(文字列) Then バイト数 = バイト数 + 1 End Select End Select Next 文字回数 End Sub

その他の回答 (4)

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

こんにちは。 #3の回答者です。ご質問者はイチゲンの方なので、戻ってくるのかわかりませんが、もう一度読み直してみました。 実際問題として、VBA自体で、インターネットを使わない限りは、全角制御文字(IN/OUT)を必要とされることはないはずですし、VBAは、Unicode ですから、半角全角自体のIN/OUT を要求されることはありませんね。使用目的がわからないと、やっぱり分かりません。 私は、今まで、#3の回答(四捨五入ではなくて切り捨て)の方法で考えてきましたし、それでよいとは思っていたのですが、IN/OUT を加算するなら、以下のように、出入りをチェックすればよいと思います。細かい点で違っているかもしれませんけれどね。 Sub Test2() Const mText = "豆1個コーヒー2杯"  MsgBox ByteCheck(mText) & " Byte Include IN/OUT"  MsgBox LenB(StrConv(mText, vbFromUnicode)) '参考 End Sub Function ByteCheck(mText As String)   Dim cnt As Long   Dim n As String   Dim flg As Boolean   For i = 1 To Len(mText)     n = Mid(mText, i, 1)     If Abs(Asc(n)) < 127 Then       cnt = cnt + 1       a = Asc(n)       flg = False     Else       If LenB(StrConv(n, vbFromUnicode)) > 1 And flg = False Then         cnt = cnt + 4         flg = True       ElseIf flg = False Then         cnt = cnt + 3       Else         cnt = cnt + 2       End If     End If   Next i   ByteCheck = cnt End Function

Sinogi
質問者

お礼

質問を締め切りに来てご回答を拝見しました。舌足らずな質問に何度も検討していただきありがとうございます。 私の結論は#1へのお礼に記載しております。よろしければご覧ください。

回答No.4

後処理でJISに変換するためのようにも思えるんですが、JISの漢字IN/OUTは3文字づつだから・・・ とりあえず、文字列をJISとSJISに変換して、JISの漢字IN/OUTが1文字づつだった場合の文字数を出す方法です。 [ツール] [参照設定] で、[Microsoft ActiveX Data Objects *.* Object Library] への参照を設定してください。 シフトJISに変換するのはstrconvでもできるんですが、同じ処理系で変換した方が安全だと思うので、両方ADODB.Streamに任せます。 Function checkLength(str As String) As Integer Dim lenJIS As Integer Dim lenSJIS As Integer Dim stm As New ADODB.Stream With stm 'jis文字長 .Open .Type = adTypeText .Charset = "ISO-2022-JP" .WriteText str .Position = 0 .Type = adTypeBinary lenJIS = UBound(.Read()) + 1 .Close 'sjis文字長 .Open .Position = 0 .Type = adTypeText .Charset = "Shift_JIS" .WriteText str .Position = 0 .Type = adTypeBinary lenSJIS = UBound(.Read()) + 1 .Close End With Set stm = Nothing checkLength = lenSJIS + (lenJIS - lenSJIS) / 3 '漢字IN/OUTが1文字づつとして計算 End Function Sub test() MsgBox checkLength("亜AA亜亜AA") & "文字" End Sub p.s. JIS中のESCの数から出す方が早いか・・・

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

こんにちは。 なんとなく、話が分からないですね。 キーワードとして出ている ・22バイトの制限 >全角文字だけなら10文字、 >半角文字だけなら22文字の取得ができます。 それはありえないです。全角は、11文字です。 >全角制御文字(2バイト)を含めて22バイト 全角制御文字って聞いたことがありません。例えば、CrLf は、全角ではなくて、2つの制御コードです。 全角・半角混在の場合で、文字列を区切る場合は、切り捨てするか、四捨五入して、最短21バイト、最長23バイトになるはずです。 Sub Macro1() Dim Str1 As String Str1 = "ソフトウェアエクセル"  '全角10文字 MsgBox Str1 & "は、" & vbCrLf & LenB(StrConv(Str1, vbFromUnicode)) & "バイトです。" End Sub Unicode を、JISに戻して、上記なら、20バイトにはなりますが、こんな単純な話なのでしょうか? 全角・半角判定なら、 Sub Macro() Dim Str1 As String  Str1 = "その名前はMicroSoft" & vbcl & "・EXCEL" If StrConv(Str1, vbNarrow) = Str1 Then   MsgBox "半角です。" ElseIf StrConv(Str1, vbWide) = Str1 Then   MsgBox "すべて全角です。" Else    MsgBox "全角・半角混ざっています。" End If End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

>制限を考慮したいのですがその 制限とは。システムにはそういう制限はないと思うが 自分が制限をかけたいということかな。質問の意味不明。 ーーー 文字コードがShiftJISと違うようですね。なんと言うコードですか。 全角文字の前後にシフトイン・シフトアウトのコードが入る文字コードかな。 さる大型機のコードでで昔苦労したが、みんな最近そんなの意識してないと思うので、質問にはっきり書かないと判りにくいのでは。 ーー A.物理的に制御文字も含めてバイト数が取れればよいのかな。 B.意味的に全角何文字+半角何文字を知りたいのかな。 A.はLENBではダメなんですか。 Bはシフト関係の文字(2種?)を空白””でSUBSTITUTEして、長さの減り具合から全角文字数は割り出せないのかな。 >LENB()でも同じ結果(文字数が返される Lenbでも制御コードの長さは省かれるということですか。聡だった毛な。

関連するQ&A

  • エクセル:文字列のバイト数が欲しい

    セルB1に、  半角スペース、全角2文字、半角スペース、 と入力しました。 このシートの別のセルに、 =Len(B1)と入力すると4と表示され、 =LenB(B1)と入力すると6と表示されますので、 間違いなく「半角スペース・全角2文字・半角スペース」がB1に入っているはずです。 このシートのコードに、 Private Sub Worksheet_Change(ByVal Target As Range)   If Target.Address = "$L$1" Then     MsgBox LenB(Cells(1, 2).Value)   End If End Sub と打ちました。 ここでシート上のセルL1に何か入力するとメッセージボックスが出るのですが、 メッセージボックスに出る値は8です。 何が原因でしょうか。 6が表示されて欲しいのですが(文字列のバイト数が欲しい)、 どのようにコードを書けばよいでしょうか。 実際にB1に入れていた文字は、 1B です。 (半角スペース・全角数字1・全角英字B・半角スペース)

  • EXCELのVBAでLenB関数について

    VBA初心者の質問です。 EXCELのVBAでセルの文字数バイト数を取得したくてLenB関数を使用しました。 しかし半角で入力してある文字(数字)でも1文字2バイトになってしまいます。 具体的に言うと以下の通りです。 ---コード--------------  Dim test As Integer  test = Len(Activecell.Value) -----------------------  Activecellのセル内容「東京1234」  TEST→「8」と取得したいのに「12」になってしまう。 -------------------- EXCEL上ではキチンと「12」になるのですがVBAでは違うのでしょうか。 どなたかご存じでしたら、よろしくお願いいたします。

  • Accessの文字数を調べたい

    住所項目で半角と全角の混ざった状態になっており、半角1文字は1として全角は1文字は2として合計文字数を算出したいのですが、良い方法を教え下さい。 例 ○○県☐☐市1-2-3 Len  11 LenB 22 求めたい値は、全角6文字×2 + 半角5文字×1 = 17

  • エクセルの半角、全角

    エクセルで、半角文字、全角文字が混在するセルを関数等で全て全角にする(半角文字を全角文字に)方法はあるでしょうか?また、文字が1バイト文字か2バイト文字かを簡単に見分ける方法はありますか?

  • 半角/全角文字混在データの分割方法

    VB6.0にて、あるデータ項目の内容を、画面上の2つの表示領域に分割して セットする方法を教えて下さい。 あるファイルの項目として、「住所」という項目があるとします。 このデータを取得し、画面に表示する際に、「住所1」「住所2」とに分割して、 セットします。 この場合、ファイル上の「住所」は、キャラクタタイプで40バイトと定義されており、 ”半角/全角文字混在”でデータが格納されています。 画面上の、「住所1」「住所2」はそれぞれ、20バイトとします。 この様な条件で、単純に取得したデータを2分割すると、 取得したデータが、全て半角か全角なら問題はないのですが、 例えば、1文字目が半角で、以降が全て全角文字だった場合に、 最後の全角文字がぴったり収まらなくなり、うまく表示できないように思います。 また、文字を取得する際に、使用している、Mid(MidB)関数やLen(LenB)関数も、 うまく利用できていないようです。(コード体系の違いでしょうか?) どなたかご教授下さい。 よろしくお願いします。

  • エクセルで、DBCSをSBCSに変換

    セルに書き込まれた文字列に漢字が含まれるかを調べようとした時に、If Len(Range("c" & i).Value) <> LenB(Range("c" & i).Value) Thenとしてみました。 セルに書き込まれた文字列は、事前に、StrConvのvbNarrow処理していたのですが、2バイトの半角文字になったようです。 lenを使わない方法でもいいのですが、文字列に漢字(漢数字、2バイト半角数字を含む)の有無を識別する方法はありますか? 詳しいかた教えて頂けないでしょうか? 別の言い方をすれば、大文字小文字を含む英数字と"-"のみで成り立つ文字列を抽出したいのです。(今書いているVBAでは、"-"が含まれている文字列の抽出を行っているので、結果的に、大文字小文字を含む英数字となります) 宜しくお願いいたします。

  • バイト数

    こんにちわ。 VB6でのすごく初歩的な質問なんですが、テキストボックスの中の文字のバイト数をLenB関数で取得して表示させようとしたのですが、半角も全角も1文字2バイトとでてしまいますがなぜでしょうか? お暇なときで結構ですのでどなたか回答をおねがいします。

  • エクセル2003で、1つのセルに全角文字、半角文字

    エクセルで文字数制限のあるセルに 全角、半角文字が混在している場合 A1 上下ABCDひだりみぎ ←対象となるセル B1全角文字数 7 C1半角文字数 4 というように対象のセルの全角文字数、半角文字数を別々のセルに表示できる方法があれば おしえてください。

  • セル内の文字で半角2文字で1文字とカウントしたい

    openofficeを利用しています。 セル内の全角と半角が混じった文章から半角2文字で1文字とカウント 全角はそのまま1文字とカウント して文字数を数えることはできますでしょうか? LENBが利用できないので困っています。 よろしくお願いします。

  • Excelで文字の長さを揃えるには

    excel95とExcel2000を使っています。 漢字やひらがな全角カタカナ全角英数字は2バイト、 半角カタカナ英数字は1バイト、 2バイトと1バイトの混在入力して20バイトの長さの文字列を比べると見た目の長さが違う。 同じ20バイトの文字列を見た目を揃える方法を教えてください。

専門家に質問してみよう