• 締切済み

VBAのLEN関数

VBAのLEN関数で1つのセルではなく横一列の範囲を指定して、それらのセルに入っている文字数の合計を取得する方法はありますか? また文字数を取得する際、全角と半角が混じっている可能性があるのですが、 半角で文字数を取得することはできるでしょうか? 何がしたいかといいますと、横一列に並んでいる複数セルの値を 別のセルに入力規則として入力させます。 その際、エクセルの仕様的に合計の文字数が半角255文字を超えないかチェックしたいのです。

みんなの回答

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

質問するなら、質問に簡単なシートのセルのデータ例を数例挙げて、結果として返してほしい文字数をか書くべきでしょう。 ーー 下記ではどうですか? 例データ A5:E5 東京都知事選  きまり  東京都  東京都123  municipal ーーー 標準モジュールに Sub test02() s = "" For Each cl In Range("a5:E5") s = s & cl Next 'MsgBox Len(s) MsgBox LenB(StrConv(s, vbFromUnicode)) End Sub 結果 42 テスト例をこちらで、たくさん作るのはむつかしいので、質問者の例でやってみて、うまくゆけば使う、そうでないならスルーしたらよい。 参考 「文字列の長さを取得 vba」で照会 https://www.moug.net/tech/exvba/0140023.html これぐらい照会して、説明されているコードを使って、やってみて、どこで困っているのかを質問に説明して質問すべきだろう。 >エクセルの仕様的に合計の文字数が半角255文字を超えないかチェックしたいのです どの機能で、そういうことが出たのかはわからない(質問者任せ)ので、それとは別の質問者の言いなりの回答になります。 たとえば https://support.office.com/ja-jp/article/Excel-%25E3%2581%25AE%25E4%25BB%2595%25E6%25A7%2598%25E3%2581%258A%25E3%2582%2588%25E3%2581%25B3%25E5%2588%25B6%25E9%2599%2590-1672b34d-7043-467e-8e27-269d656771c3?ui=ja-JP&rs=ja-JP&ad=JP&fromAR=1 の「列の幅」か?

回答No.5

X 文字数が半角255文字を超えないかチェックしたい O 文字数が半角255バイトを超えないかチェックしたい 下の意味だとして Public Function LenH(ByVal Text As String) As Integer   LenH = LenB(StrConv(Text, vbFromUnicode)) End Function と、私は自作の LenH() を利用しています。

回答No.4

すみません。回答No,2に補足を追記します。   ret = Evaluate("lenb(concat(aa2:ae2))")   Debug.Print Evaluate("aa2&ab2&ac2&ad2&ae2")   Debug.Print Evaluate("lenb(aa2&ab2&ac2&ad2&ae2)") これら、アクテイブではないシートのセル範囲を対象にする 場合もあるでしょうから、 なるべくなら、Evaluateメソッドの親オブジェクトをキチンと指定 した方が紛れが無くてベターなのかも、です。 シート名が"Sheet1"である場合の例で、それぞれ、、、。   ret = Sheets("Sheet1").Evaluate("lenb(concat(aa2:ae2))")   Debug.Print Sheets("Sheet1").Evaluate("aa2&ab2&ac2&ad2&ae2")   Debug.Print Sheets("Sheet1").Evaluate("lenb(aa2&ab2&ac2&ad2&ae2)") 追加補足、以上です。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

以下のコードでいかがでしょう。 Sub Example() Dim MyRange As Range Dim MyStr As String MyStr = "" For Each MyRange In Range("A1:F1") MyStr = MyStr & MyRange.Value Next 'VBAでは文字列はUnicodeのために半角でも2バイトになるので文字列をUnicodeからシステムの既定のコード(Shift_JIS)に変換 MyStr = StrConv(MyStr, vbFromUnicode) Debug.Print LenB(MyStr) End Sub

回答No.2

こんにちは。 旧来、 文字長をバイト長(半角を1全角を2)として取得するには、  Excel(ワークシート関数)では LENB()関数  VBAでは LenB()関数 を使うことになりますが、 この内、近年でのVBAでの文字列値の扱いについては、 環境によってはUnicodeでの扱いになりますので、  LenB("a")  LenB("あ") どちらも 2 を返す場合(環境)もあります。 なので、 Excel(ワークシート関数)のLENB()関数 をVBAから呼び出して使う方が、 汎用的で、間違いが少なく、却って簡単です。  ※以下、AA2:AE2 の範囲の表示文字列を対象にする例です。 ' ' // Sub ReW9209343() Dim ret   ret = Evaluate("lenb(concat(aa2:ae2))")   Debug.Print ret End Sub ' ' // お使いのExcel(Office)のバージョンが、2016より旧い場合は、 以下のUDFsを当該ブックの標準モジュールに加えて下さい。 ' ' // Public Function CONCAT(r As Range) ' As String Dim c As Range Dim sBuf As String   For Each c In r     sBuf = sBuf & c.Text   Next   CONCAT = sBuf End Function ' ' //  ※念の為、ワークシート上で、  |=CONCAT(セル範囲)  |のように数式を確定して動作確認をしてから試すようにしてください Excel(ワークシート関数)のLENB()関数 を使いたくない場合は、 連結した文字列に対して一旦、  StrConv(文字列, vbFromUnicode) としてから、VBAのLenB()関数を使うことになるでしょう。 ただ、文字列の連結を簡単に済まそうということになると、 結局は、Excel(ワークシート関数)の関数や数式、VBAのEvakuate、 を使う方が簡単ではあるので、 わざわざVBAのLenB()関数を使う必要性は低いのかも、です。   Debug.Print Evaluate("aa2&ab2&ac2&ad2&ae2") のように、個々のセルを参照する文字列さえ与えてやれば、 CONCAT()関数が無い環境でも簡単に文字列の連結を実現できます。   Debug.Print Evaluate("lenb(aa2&ab2&ac2&ad2&ae2)") のように、バイト長を直接取得することもできます。 もし、対象の範囲が固定であるなら、 こういったやり方の方が簡単なケースもある、ということです。 以上です。

回答No.1

列数が多いとめんどくさいですが、ABCD列とかの数、範囲なら、 =LenB(Range("A1").Text & Range("B1").Text & Range("C1").Text & Range("D1").Text) =LenB(Range("A1").Text) + LenB(Range("B1").Text) + LenB(Range("C1").Text) + LenB(Range("D1").Text) とか。 > 半角で文字数を取得することはできるでしょうか? 上のようにLenB関数を利用します。 ワークシートでも同名のLENB関数は使えるので、作業列や配列数式使って計算する方が良い場合もあるかも。

関連するQ&A

  • 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では違うのでしょうか。 どなたかご存じでしたら、よろしくお願いいたします。

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

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

  • VBA LENの使い方

    Lenを使う際にStrings.Lenとしないとエラーとなる場合があります。 Lenを使う際にクラスを明記すればいいんだと理解しましたが、別の問題が発生しました。 ユーザー定義のバイト数を求めるときにStringsをつけるとエラーになります。(いかにエラーになるコードを記載しました。) (LenはLenBとしてもエラーになります) そもそも、 クラスを明記しないとLenが探せない場合があってエラーになると思っていましたが、違うのでしょうか? オブジェクトブラウザでLenを検索してもVBAのStringしか出てきません。 Type a aa As Integer bb As Integer End Type Dim b As a Sub test() Dim a As Integer b.aa = 100 a = Strings.Len(b) End Sub

  • エクセルでセルに入力制限をしたいのですが。

    例えばA1のセルには全角で10文字まで、B1のセルには半角カナで10文字までという入力制限ができるでしょうか?入力規則で設定したところ、文字数制限はできるのですが、半角,全角の区別をしてくれません。 よろしくお願いします。

  • VBAで( )のものだけ(   )に変更したい

    お世話になります。 現在エクセルの複数のセルに( )空白のスペースが入った()があります。 ※()の中は半角・全角のスペースが中身が半角・全角のスペースの数がさまざまな形で入っています。 ()の中に入っているのは半角・全角のスペースがはいている()のみ( )※全角スペース3個 のものに変換したいのです。 しかしながら、他のセルに(2222)などの()の間に数字や文字が入っているものがあり、それに対しては、そのままにしたいのです。 エクセルのVBAで実現したいのですが、どのようにすればよいでしょうか? 何卒よろしくお願いします。

  • Excel:関数と入力規則

    セル[A2]に入力規則>設定タブ>入力値の種類で「ユーザー設定」、数式に「=LENB(A2)<=16」 と設定しています。 この設定によりこのセルには全角8文字もしくは半角16文字を超えての入力を禁止させています。 その隣のセル[B2]にはセル[A2]の入力値がそのまま自動表示されるように「=A2」とし、かつ入力規則>設定タブ>入力値の種類で「ユーザー設定」、数式に「=LENB(A2)<=12」 と設定しています。 この設定によりこのセルには全角6文字もしくは半角12文字を超えての入力を禁止させています。 例えば、セル[A2]への入力文字が全角6文字以内であれば問題ないのですが、8文字になった場合、セル[B2]の入力規則が無視され、8文字で表示されてしまうのです。 これは仕方がないのでしょうか? ちなみにセル[B2]の関数を無視して直接セル[B2]に入力するのは入力規則が正常に反応し、全角7文字以上は入力できません。 何か良い方法があれば御教示願います。

  • Access2000 Len関数 フォームで困っています

    最近Accessを始めた初心者です。 レポートで出力する際に文字が切れないように、フォームで入力文字数の制限をするため、Len関数でプロパティの入力規則に以下の設定をしました。 入力規則 Len([フィールド名])<51 エラーメッセージ 50文字以下に調整してください。 で、入力テストをしてみたところ、50文字まで入力可能、51文字からエラーメッセージが表示されるところまでは問題ないのですが、エラーの発生したテキストボックスを空にして、他のテキストボックスへ移動すると、また同じエラーメッセージが出てしまいます。 その後は何文字か入力しないと次のテキストボックスに移れなくなってしまい、入力する場所を間違えた場合にフォームを開きなおさねばならない状態です。 他には新しいレコードに移る際に、コードに以下のメッセージを設定していますが、他は何もしていません。 Private Sub Form_BeforeUpdate(Cancel As Integer) Beep If MsgBox("情報が変更されています! 変更されたデータを保存しますか?", _ vbYesNo + vbQuestion) = vbNo Then Me.Undo Cancel = True End If End Sub どなたかご教授いただけないでしょうか。

  • VBAを使って開発しているのですが

    VBAを使って開発しているのですが、 テキストボックスにバイト数で制限はかけられないのでしょうか? MaxLength を指定しているのですが、 5と指定しても、全角でも半角でも5文字入力出来てしまいます。 よろしくお願いします。

  • Accessの文字数を調べたい

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

  • 【Excel VBA】A列の全角・半角文字をチェック

    【Excel VBA】A列の全角・半角文字をチェック Excel VBAの初心者です。 仕事で必要なため、教えていただけると助かります。 【やりたいこと】 Excel VBAで、入力が完了したExcelシートのA列(A1からA10)が、 半角のみであること、または全角が入力されていないこと、を チェックしたいです。 半角以外の文字があった場合は、メッセージを表示します。 また、半角以外のセルがあった場合は、そのセルの色を水色にします。 入力チェックの方法は、ボタンにマクロを登録して、 そのボタンを押下することで行います。 以下に、僕が試したプログラムを記します。 アドバイスをいただけると幸いです。よろしくお願いします。 Sub 入力チェック() Dim cellValue As String Dim strANSI As String Dim i As Integer For i = 0 To 10 cellValue = Cells(1, i + 1) strANSI = StrConv(cellValue, vbFromUnicode) If Len(cellValue) = LenB(strANSI) Then MsgBox "セルは半角のみ" myColor = 8 Else MsgBox "セルの内容は全角のみ" End If MsgBox "セルの内容は全角と半角があり" Next i End Sub

専門家に質問してみよう