- 締切済み
VBAのLEN関数
VBAのLEN関数で1つのセルではなく横一列の範囲を指定して、それらのセルに入っている文字数の合計を取得する方法はありますか? また文字数を取得する際、全角と半角が混じっている可能性があるのですが、 半角で文字数を取得することはできるでしょうか? 何がしたいかといいますと、横一列に並んでいる複数セルの値を 別のセルに入力規則として入力させます。 その際、エクセルの仕様的に合計の文字数が半角255文字を超えないかチェックしたいのです。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
質問するなら、質問に簡単なシートのセルのデータ例を数例挙げて、結果として返してほしい文字数をか書くべきでしょう。 ーー 下記ではどうですか? 例データ 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 の「列の幅」か?
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
すみません。回答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
- ベストアンサー率66% (1719/2589)
以下のコードでいかがでしょう。 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
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。 旧来、 文字長をバイト長(半角を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)") のように、バイト長を直接取得することもできます。 もし、対象の範囲が固定であるなら、 こういったやり方の方が簡単なケースもある、ということです。 以上です。
- neKo_quatre
- ベストアンサー率44% (735/1636)
列数が多いとめんどくさいですが、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関数は使えるので、作業列や配列数式使って計算する方が良い場合もあるかも。