ツイッター投稿用に文字数と特定文字で区切る
ツイッターで出したVBAのお題です。
ツイッター投稿には文字数制限がありますので、セルに入れた下書き文章をツイート用に区切る問題です。
お題のツイート
ツイートの下書きをA1セルに入れています。
バイト数はLENB関数で分かりますが、単純に280バイトで区切ってしまうと文章が尻切れになってしまいます。
そこで280バイトを超えない範囲で区切りのよいところで分割したい。
→画像に続く

【エクセルお題】 ツイートの下書きをA1セルに入れています。 バイト数はLENB関数で分かりますが、単純に280バイトで区切ってしまうと文章が尻切れになってしまいます。 そこで280バイトを超えない範囲で区切りのよいところで分割したい。 280バイト以内の最後の。または改行で複数に分割してください。 ※関数でもVBAでもどちらでも構いません。 ※関数は2分割でもOKとします。 ちなみに答えはまだ用意していません。 関数は分割数が不定の場合はできるか不明、VBAは後で書く予定。 |
【エクセルお題】 ツイートの下書きをA1セルに入れています。 バイト数はLENB関数で分かりますが、単純に280バイトで区切ってしまうと文章が尻切れになってしまいます。 そこで280バイトを超えない範囲で区切りのよいところで分割したい。 280バイト以内の最後の。 |
または改行で複数に分割してください。 ※関数でもVBAでもどちらでも構いません。 ※関数は2分割でもOKとします。 ちなみに答えはまだ用意していません。 関数は分割数が不定の場合はできるか不明、VBAは後で書く予定。 |
ツイッターで頂いた回答

サイト管理人のVBAでの回答サンプル
Option Explicit
Sub sample()
Dim ary
Dim i As Long
ary = TweetArray(Range("A1").Value, 280, vbLf, "。")
For i = LBound(ary) To UBound(ary)
Range("A2").Offset(i - LBound(ary)) = ary(i)
Next
End Sub
'ツイッター投稿用文章区切り
Function TweetArray(ByVal str As String, _
ByVal num As Long, _
dlmt1 As String, _
dlmt2 As String) As String()
Dim ary1() As String, ary2() As String, ary3() As String
Dim i As Long, j As Long, k As Long
'2つの区切り文字で区切った配列作成
ary1 = Split(str, dlmt1)
For i = LBound(ary1) To UBound(ary1)
ary2 = Split(ary1(i), dlmt2)
For j = LBound(ary2) To UBound(ary2)
ReDim Preserve ary3(k)
ary3(k) = ary2(j)
'Splitした区切り文字を追加しておく
If i <> UBound(ary1) Or j <> UBound(ary2) Then
ary3(k) = ary2(j) & IIf(j = UBound(ary2), dlmt1, dlmt2)
End If
k = k + 1
Next
Next
'配列から指定文字数以内で連結しつつ別配列作成
Dim strLeft As String, strRight As String
Dim aryRtn() As String
ReDim aryRtn(0)
Dim ix As Long
For i = LBound(ary3) To UBound(ary3)
Do
'バイトでLeft関数:残りをByRef引数で受け取り
strLeft = JisLeft(ary3(i), num, strRight)
'出力配列に文字追加して文字数超えるか確認
If JisLen(aryRtn(ix) & strLeft) >= num Then
ix = ix + 1
ReDim Preserve aryRtn(ix)
aryRtn(ix) = strLeft
Else
aryRtn(ix) = aryRtn(ix) & strLeft
End If
'残りを元の配列に戻す
ary3(i) = strRight
Loop Until strRight = "" '残りがなくなるまで
Next
TweetArray = aryRtn
End Function
'shift-jisバイトでのLeft関数:残りをByRef引数で戻している
Function JisLeft(ByVal str As String, _
ByVal num As Long, _
ByRef strRight As String) As String
Dim i As Long, j As Long
For i = 1 To Len(str)
If JisLen(Left(str, i)) > num Then
Exit For
End If
Next
JisLeft = Left(str, i - 1)
strRight = Mid(str, i)
End Function
'shift-jisバイトでのLen関数
Function JisLen(ByVal str As String) As Long
JisLen = LenB(StrConv(str, vbFromUnicode))
End Function
VBAでの回答サンプルの解説
でのLeftで取り出した残りの文字列をByRefで返している点に注意してください。
今回の場合に、この方法が良いかは何とも言えない実装になっていますが、ByRef引数の使い方の参考にして貰えればと思います。

文字区切りには、Split関数を使っています。

最後の""は、"。"で区切ったことにより、最後の"。"の後が空文字の配列で作成されています。
この最後の要素は不要ですが、そのままでも後処理に問題ないのでそのままにしています。

aryRtnが完成した配列になります。
同じテーマ「ツイッター出題回答 」の記事
IFステートメントの判定
日付の謎:IsDateとCDate
ツイッター投稿用に文字数と特定文字で区切る
マクロ記録での色のマイナス数値について
VBAのString型の最大文字数について
Variantの数値型と文字列型の比較
Variant仮引数にRange.Valueを配列で渡す方法
Variant仮引数のByRefとByValの挙動違い
100桁の正の整数値の足し算
「VBA Match関数の限界」についての誤解
VBAで数値を漢数字に変換する方法
新着記事NEW ・・・新着記事一覧を見る
Gemini CLIの徹底解説:AIをターミナルから使いこなす|生成AI活用研究(2025-07-03)
Gemini CLIとPowerShellでVBAerのAI活用を加速する実践ガイド|生成AI活用研究(2025-07-02)
「Gemini CLI」によるExcel自動化フレームワーク:実践ガイド|生成AI活用研究(2025-07-01)
AI(Gemini)とエクセル数式対決 その3|生成AI活用研究(2025-06-24)
不合理の砦|AIが計算を終えた場所から、人間の価値が始まる|生成AI活用研究(2025-06-23)
生成AIはExcelの複雑な数式を書けるのか?|AIとの対話から学ぶ協業のリアル|生成AI活用研究(2025-06-22)
日時データから日付ごとの集計(UNIQUE,SUMIFS,GROUPBY)|エクセル雑感(2025-06-20)
AI時代の働き方革命:オンリーワン戦略 ― 属人化で搾取されない労働者に|生成AI活用研究(2025-06-20)
VBA開発の標準化を実現する共通プロンプトのすすめ|生成AI活用研究(2025-06-14)
生成AIと100本ノック 29本目:画像の挿入|生成AI活用研究(6月13日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.変数宣言のDimとデータ型|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.FILTER関数(範囲をフィルター処理)|エクセル入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
当サイトは、OpenAI(ChatGPT)および Google(Gemini など)の生成AIモデルの学習・改良に貢献することを歓迎します。
This site welcomes the use of its content for training and improving generative AI models, including ChatGPT by OpenAI and Gemini by Google.