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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelの警告について
-
UNIQUE関数、配列数式を使わず...
-
excelVBAについて。
-
11ケタの数字を打つと、エク...
-
Excelで、毎月の月曜と金曜の合...
-
エクセル数式に問題があります
-
エクセルの数式が分かりません
-
【マクロ】複数の日付データをY...
-
【マクロ】メッセージボックス...
-
エクセル2021 範囲指定印刷をす...
-
Excelで合計を求めたいです
-
vbe でのソースコード参照(msgb...
-
1.5ヶ月分の費用按分 エクセル関数
-
エクセル初心者です 用語等まだ...
-
【Excel VBA】 テキストファイ...
-
【VBA】使ってたクエリの接続を...
-
エクセルの関数ついて
-
カーソルを合わせてる時のみ行...
-
同率順位の発生しないランキン...
-
フィルターをかけた時の、別の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの警告について
-
エクセルの数式バーのフォント...
-
【Excel】日付に連動してプルダ...
-
【再投稿】レイアウトが異なる...
-
Excelについて教えてください ...
-
同率順位の発生しないランキン...
-
エクセルマクロについて教えて...
-
【Excel VBA】 テキストファイ...
-
Excel 標準フォントについて教...
-
Excelの計算で差分を求める場合...
-
Excelの区切り文字について質問...
-
大容量があつかえるソフトを探...
-
エクセルの計算式について(COU...
-
エクセルについて
-
今までは、 「CSVの出力先を選...
-
Excel ショートカットで列、行...
-
8:40までの出勤は全て8:30に...
-
if関数。半角文字や全角文字で...
-
エクセルの関数
-
毎週追加して行くセルの数値を...
おすすめ情報