![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.6ベストアンサー
- 回答日時:
なんどもすいません。
コード拝見させていただきました。Max関数で処理してるのがスマートですね。
蛇足ながら、もし処理目的を5行以上にするときは、
If UBound(sText) > 1 Then 行2 = Len(sText(1))
If UBound(sText) > 2 Then 行3 = Len(sText(2))
<中略>
maxd = Application.WorksheetFunction.Max(行1, 行2, 行3, 行4, 行5)
MsgBox maxd
の部分を
Dim LineLen() As Long
ReDim LineLen(UBound(sText))
For i = 0 To UBound(sText)
LineLen(i) = Len(sText(i))
Next
maxd = Application.WorksheetFunction.Max(LineLen)
MsgBox maxd
にすると行数に制限無くMAX値を求められます。
重ね重ねありがとうございます。
For Next使いながら代入も出来ちゃうんですね!
とっても勉強になりました。
これからも見かけたらまたご指導のほどよろしくお願い申し上げます。
No.7
- 回答日時:
最後の横レス失礼します。
an_inackです。
・データ行数は5行と決まっている
・1行最大値48文字を超えたらメッセージ表示
て、ことなのかな?
お書きになられたコードで問題なく動くようであれば
そのままでOKなんじゃないかなと思います。
お疲れ様でした(w
参考までに、こんな書き方もできるってことで。
'If UBound(sText) > 1 Then 行2 = Len(sText(1))
'If UBound(sText) > 2 Then 行3 = Len(sText(2))
'If UBound(sText) > 3 Then 行4 = Len(sText(3))
'If UBound(sText) > 4 Then 行5 = Len(sText(4))
'
'maxd = Application.WorksheetFunction.Max(行1, 行2, 行3, 行4, 行5)
'MsgBox maxd
'
'If maxd > 48 Then
'MsgBox "48文字を超える行がありまするぅ。 ", vbExclamation, " 確認"
'End If
この部分ですが
↓↓↓↓
'各行ごとにMax48文字チェック
maxd = 0
For i = 0 To UBound(sText)
If Len(sText(i)) > 48 Then
MsgBox i + 1 & "行目で48文字超えとるがな", vbExclamation, " 確認"
Exit Sub
End If
'最大値を変数に欲しいなら
If Len(sText(i)) > maxd Then
maxd = Len(sText(i))
End If
Next
MsgBox "最大文字数は" & maxd & "文字なり。"
こんなんしてみました。
質問者さんとの違いは、
すべての行の文字数を変数に取得してから、
最大値をとって、Max文字数チェックをする部分。
私の場合は、1行ずつチェックして、
1行でもMax超えてたら処理抜けてることですかね。
No.5
- 回答日時:
#1です。
>>存在しない行
了解しました。#1で提示したものは、
セル内文字を改行をセパレータに配列に取り込む方法、
その配列の次元数が行数、配列の各要素が各行に対応していることを示す例文です。
MsgBox で表示するのでしたら、#3の例外処理を加味して以下のようされてはどうでしょう。
Sub Macro1()
Dim sText As Variant
Dim rRng As Range
Dim sMsg As String
Dim i As Long
On Error Resume Next
Set rRng = Selection
If Err Then
MsgBox "セルを選択して実行してください。"
Exit Sub
End If
On Error GoTo 0
sText = rRng.Cells(1, 1).Text
If sText = "" Then
MsgBox "文字が入力されていません。"
Exit Sub
End If
sText = Split(sText, vbLf, , vbBinaryCompare)
sMsg = "行数 : " & UBound(sText) + 1 & vbLf
For i = 0 To UBound(sText)
sMsg = sMsg & "行" & i + 1 & " : " & Len(sText(i)) & "文字" & vbLf
Next
MsgBox sMsg
End Sub
何度もありがとうございます。
こんな感じでやってみました。
Dim sText As Variant
sText = Range("通信欄").Text
If Len(Trim(sText)) = 0 Then
MsgBox "通信文がありませぬぅ。 ", vbCritical, " Sorry !!"
Exit Sub
End If
sText = Split(sText, vbLf, , vbBinaryCompare)
行数 = UBound(sText) + 1
If 行数 > 5 Then
MsgBox "5行を超えていますぅ! ", vbCritical, " Sorry !!"
Exit Sub
End If
行1 = Len(sText(0))
If UBound(sText) > 1 Then 行2 = Len(sText(1))
If UBound(sText) > 2 Then 行3 = Len(sText(2))
If UBound(sText) > 3 Then 行4 = Len(sText(3))
If UBound(sText) > 4 Then 行5 = Len(sText(4))
maxd = Application.WorksheetFunction.Max(行1, 行2, 行3, 行4, 行5)
MsgBox maxd
If maxd > 48 Then
MsgBox "48文字を超える行がありまするぅ。 ", vbExclamation, " 確認"
End If
直すべきところがありましたらご教示くださいませ。
No.4
- 回答日時:
#1さんの書かれたコードが何をしているか
簡単にですが見てみましょう。
sText = Split(sText, vbLf, , vbBinaryCompare)
ここではsTextという変数に、
指定されたセルの値を、
改行を区切り文字として配列に取得しています。
たとえばセル内に2行あったとすると、
sText(0)
sText(1)
にまで値が入ります。
ちなみに、sText(2)には値がありませんから、
当然使おうとするとエラーになります。
>If IsError(Len(sText(2))) Then
> MsgBox "行がないです。"
>Else
> MsgBox "行 3:" & Len(sText(2)) & "文字"
>End If
でエラーになるのは1行目で存在しない
sText(2)を指定しているためです。
このエラーを回避したければ、
存在する配列分処理をするよう書けばいいと思います。
Dim sText As Variant
Dim i As Integer
sText = Range("通信欄").Text
sText = Split(sText, vbLf, , vbBinaryCompare)
For i = 0 To UBound(sText)
MsgBox "行" & i + 1 & ":" & Len(sText(i)) & "文字"
Next
詳しくはヘルプ、またはVBAのレクチャーサイトなどで、
「配列」をキーワードに調べてみると、
知識が深まると思いますよ~!
For i = 0 To UBound(sText)
MsgBox "行" & i + 1 & ":" & Len(sText(i)) & "文字"
Next
なるほど、これはいいですね!・・・・・と思ったのですが、実際はメッセージボックスではなく変数に代入しているので使えないですよね?
でも「存在する配列分処理をするよう書けばいい」とのアドバイスで、
If UBound(sText) > 1 Then 行2 = Len(sText(1))
If UBound(sText) > 2 Then 行3 = Len(sText(2))
If UBound(sText) > 3 Then 行4 = Len(sText(3))
If UBound(sText) > 4 Then 行5 = Len(sText(4))
としてみましたら、無事回避できました。
ありがとうございました。
No.3
- 回答日時:
#1です。
>というか、存在しない行のところでエラーになります。
がちょっと不明なんですが、取りあえず On Error Resume Next で
いいと思います。以下はそれ以外に思いついたものです。
Dim sText As Variant
Dim rRng As Range
On Error Resume Next
Set rRng = Selection
If Err Then
'例外処理:セル以外を選択している
End If
On Error GoTo 0
sText = rRng.Cells(1, 1).Text
If sText = "" Then
'例外処理:空白セル
End If
sText = Split(sText, vbLf, , vbBinaryCompare)
If UBound(sText) < 1 Then
'例外処理:セル内改行していない
End If
この回答への補足
>>というか、存在しない行のところでエラーになります。
>がちょっと不明なんですが、
たとえば、セル内に2行しかない場合、
Dim sText As Variant
sText = Range("通信欄").Text
sText = Split(sText, vbLf, , vbBinaryCompare)
MsgBox "行数:" & UBound(sText) + 1
MsgBox "行 1:" & Len(sText(0)) & "文字"
MsgBox "行 2:" & Len(sText(1)) & "文字"
MsgBox "行 3:" & Len(sText(2)) & "文字"'←ここでエラー
「インデックスが有効範囲にありません」と出ます。
If IsError(Len(sText(2))) Then
MsgBox "行がないです。"
Else
MsgBox "行 3:" & Len(sText(2)) & "文字"
End If
とやっても、同じでした。
No.2
- 回答日時:
こんにちは。
maruru01です。数式(関数)での方法です。
かなり面倒になります。
仮に、A1:B5が結合されていて文字列が入力されているとします。
C1に行数、D1から下の行へ順に各行の文字数を表示します。
まず、C1に、
=LEN($A$1)-LEN(SUBSTITUTE($A$1,CHAR(10),))+1
と入力します。
次に、D1に、
=IF(ROW(A1)<=$C$1,FIND("?",SUBSTITUTE(CHAR(10)&$A$1&CHAR(10),CHAR(10),"?",ROW(A2)))-FIND("?",SUBSTITUTE(CHAR(10)&$A$1&CHAR(10),CHAR(10),"?",ROW(A1)))-1,"")
と入力して、下の行へコピーします。
ちょっと補足しますと、結合されたセルに入力すると左上のセルに値が入ります。
(したがって、数式中の"$A$1"は結合セルの値を参照しています。)
D1の数式の"$C$1"は1つ目の行数のセル(絶対参照)のことです。
さらに、D1の数式中のROW関数の引数の"A2"、"A1"は、数式を入力するセルがD1でなくても、調べるセル(の左上)がA1でなくても、常にA2、A1を(相対参照で)指定して下さい。
また、D1の数式中の"?"は、仮に変換する文字で、元の文字列中に絶対に存在しない文字を使用して下さい。
そういう文字がどうしてもない場合は、
"?"→CHAR(9)
にして下さい。
VBAが分かるのであれば、No.1の方とかのようにVBAでやった方がいいと思います。
No.1
- 回答日時:
こんにちは、こんな感じですか?
Dim sText As Variant
sText = Selection.Cells(1, 1).Text
sText = Split(sText, vbLf, , vbBinaryCompare)
MsgBox "行数:" & UBound(sText) + 1
MsgBox "行 1:" & Len(sText(0)) & "文字"
MsgBox "行 2:" & Len(sText(1)) & "文字"
・・・・以下同様
エラートラップとか書いてませんけど。
ありがとうございます。
これでなんとかなりそうなのですが、改行していないとというか、存在しない行のところでエラーになります。
On Error Resume Next以外に防ぐ方法はあるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 列を指定して値を左から5文字にそろえる 1 2022/06/10 20:28
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- その他(Microsoft Office) ある表(10桝程度)の中に数字が入っています。ダブっている数字を除く数字の合計数の計算方法 5 2023/02/15 11:33
- Excel(エクセル) エクセルでA列セル内で折り返すことなく、文字列を、B列C列・・・側に一行に 2 2022/07/23 02:02
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/12/26 12:05
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/01/06 08:39
- Excel(エクセル) 条件に合った数値の合計を表示させたい関数と条件指定の方法 3 2023/05/13 16:07
- Excel(エクセル) Excelでの検索結果を含む行だけを表示させたい 5 2023/03/10 17:08
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
IFとIFS関数
-
Excelを無料で使うには? パソ...
-
セルの数を求めたい
-
エクセルの数式バーのフォント...
-
Excelの表示についての質問
-
再質問です。マクロの修正箇所...
-
データチェックを行うエクセル...
-
Excelに詳しい方! B列が「日...
-
西暦や和暦の表示をyyyymmdd表...
-
Excelで50個のセルに同じ文字を...
-
Excelの数式について教えてくだ...
-
Excel VBAで全ての矢印を赤色に...
-
エクセル関数を使って
-
祝日と土曜、日曜の合計をカウ...
-
xlsxファイルを保存する際にPDF...
-
Excelについて
-
エクセルVBA、別ブックへ転記す...
-
エクセルで「ページレイアウト...
-
2列に入っているデータを1列...
-
【ExcelVBA】名前を付けて保存→...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
半角カタカナをヘボン式ローマ...
-
(マクロ)vlookupの元データを同...
-
エクセルで上位バイトのセルと...
-
exselの質問です
-
Excel 大小比較演算子による「...
-
Excel VBについての質問です。
-
エクセルの問題です。絶対値の...
-
非表示列の再表示に失敗
-
職場の人から聞かれており、こ...
-
Excel関数-文字列で自動作成さ...
-
Excelデータをコピペして、ペー...
-
ユーザー定義関数をアドイン登...
-
【マクロ】for next構文について
-
エクセルの日付を編集する
-
【マクロ】VLOOKUPにて参照元に...
-
exselで最小数で並び替える関数
-
libre 表計算ソフトの計算がう...
-
エクセルで表
-
エクセルの表で1年間の曜日を...
-
西暦和暦
おすすめ情報