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も見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
コンビニでおにぎりを買うときのスタメンはどの具?
コンビニでおにぎりを買うとき、何の具材を選ぶことが多いですか?
-
洋服何着持ってますか?
洋服を減らそうと思っているのですが、何着くらいが相場なのかわかりません。
-
思い出すきっかけは 音楽?におい?景色?
記憶をふと思い出すきっかけは 音楽、におい、景色 どれですか?
-
エクセル「折り返して全体を表示」での折り返しの行数取得方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】シート追加時に同じ...
-
別のシートの指定列の最終行を...
-
システムファイルについて
-
スプレッドシートでの数値集計
-
Excel関数の解決方法
-
Vba アドインソフトのバージョ...
-
Excelファイルを開くと私だけVA...
-
自動的に日付入力 応用
-
UNIQUE関数の代用
-
カーソルを合わせてる時のみ行...
-
エクセルの設定、下へスクロー...
-
エクセルの設定、特定の列以降...
-
【マクロ】表における同じお客...
-
Excel 日付の表示が直せません...
-
エクセルの数式について教えて...
-
Excelファイルが開けません
-
Excelの関数を教えて下さい。
-
Excelでプルダウン選択(I1セル)...
-
Excelのsumifで検索する範囲を...
-
エクセルで、数字の下4桁の0を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【マクロ】重複する同じ行を、...
-
Excelの条件付き書式のコピーと...
-
vba 印刷設定でのカラー印刷と...
-
VBA の単語の意味を教えて下さい。
-
Excel 日付の表示が直せません...
-
エクセル 同じ行の隣り合う数字...
-
エクセル条件付き書式について。
-
エクセルの数式につきまして
-
ファイル名の変更
-
エクセル 数字のみ抽出につて
-
Excelの開始ブックを固定したい...
-
エクセルの数式について教えて...
-
エクセルのセルをクリックする...
-
=INDIRECT(RIGHT(CELL("filenam...
-
エクスプローラーで見ることは...
-
Excelの関数で質問です
-
至急お願いいたします 屋上の備...
-
エクセルでセルに入力する前は...
-
関数を教えて下さい
-
Excel 関数での質問です
おすすめ情報