[[20190627065530]] 『文字数制限による自動改行させるマクロについて』(右近) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字数制限による自動改行させるマクロについて』(右近)

お尋ねします。
以下のマクロを参考に次のような動作を可能にできればと思っています。
前提としまして、
C列からV列を結合させて一行としています。
C23:C35、C38:C68、C71:C101に全角35文字(半角70文字)、全角の中に半角が混在したとしても半角2文字で全角1文字として、
入力するとします。
例えば、C23行目に文章を上記の文字数を超えて入力した場合、その上限を超えた文字は、次の行であるC24に入力されるようにしたいのです。
C35行目に同様に入力した場合は、C38行目に入るようにしたいのです。C68行目の場合もC71行目に入るようにしたいのです。
このように入るようにするには、どのように修正が必要でしょうか。
以下のマクロは、ネットから参照させていただいています。
よろしくお願いします。

Const RanVal As String = "A1" 'セルの個所を設定
Const MaxSt As Long = 44 '切り分ける文字数を設定

Dim Flag As Boolean
Dim StVal As String, ICon As Integer
Dim Start_M As Integer, Last_M As Integer

Private Sub Worksheet_Change(ByVal Target As Range)
If Flag = True Then Exit Sub
If Range(RanVal).Address = Target.Address Then
Flag = True
StVal = Range(RanVal)
ICon = S_LCON(Len(StVal))
Start_M = 1
For i = 1 To ICon
Target.Offset(i - 1, 0).Value = Mid(StVal, Start_M, MaxSt)
Start_M = Start_M + MaxSt
Next i
Flag = False
End If
End Sub

Function S_LCON(A As Integer) As Integer
If (A Mod MaxSt) <> 0 Then
S_LCON = Application.WorksheetFunction.RoundUp(A / MaxSt, 0)
Else
S_LCON = A / MaxSt
End If
End Function

< 使用 Excel:Excel2013、使用 OS:Windows7 >


 おはようございます ^^
エクセルで全角、半角を調べるのはかんたんそぉ〜で実は文字コード泥沼
にはまる手前だったりして、  ←   わたしだけかも^^;
濁点の半角カタカナ、とか ^^;)セルとVBAの文字コードが違ったりとか
出来なくは無いのでしょうが、かなり専門的なスキルが無ければ難しいか
もですね。文字数で良ければ比較的簡単だとは思うのですが。目的は文字の
整形でしょうか?全て全角で等幅フォント使用ならOKかもですね。← なかなか
環境(上司様等)が許してくれなかったりしますね。
賛否両論ですが。。。←どこかで聞いたような^^、エクセル方眼紙方式だと
セル内に収まれば綺麗に揃いますよ。
(隠居じーさん) 2019/06/27(木) 09:00

簡単なのは作業列を2つ作る事でしょうね

Wに=LEFTB(C23,70)
Xに=MIDB(C23,71-LENB(LEFT(C23,LEN(W23)))+LENB(W23),LENB(C23))

を入力して

Private Sub Worksheet_Change(ByVal Target As Range)

Dim 列 As Variant
Dim 補正 As Variant
Dim 判定 As Variant
Dim 文字 As Variant
Dim 残 As Variant

列 = ActiveCell.Row - 1
判定 = LenB(StrConv(Cells(列, 3), vbFromUnicode))
文字 = Cells(列, 23).Value
残 = Replace(Cells(列, 24).Value, " ", "")

If 判定 >= 71 Then

If 列 = 35 Or 列 = 68 Then

補正 = 3
Else
補正 = 1
End If

Cells(列 + 補正, 3) = 残
Cells(列, 3) = 文字

End If

End Sub

上記で望んだ結果になるかと思います。
(名無し) 2019/06/27(木) 10:54


名無しさん、隠居じーさん、ありがとうございます。
名無しさんに質問です。

簡単なのは作業列を2つ作る事でしょうね

Wに=LEFTB(C23,70)

 Xに=MIDB(C23,71-LENB(LEFT(C23,LEN(W23)))+LENB(W23),LENB(C23)) 

を入力して

とは、具体的にどういうことでしょうか?今一度、詳しくお教えください。
よろしくお願いします。

(右近) 2019/06/27(木) 15:37


そのままの意味です。
使用していないであろうW列とX列を作業列として使ってください。

W23=LEFTB(C23,70)
X23=MIDB(C23,71-LENB(LEFT(C23,LEN(W23)))+LENB(W23),LENB(C23))

上記式を入れると
W列では70バイトまでの文字列が、
X列では71バイト以降の文字が表示されているはずですので、
あとはデータ範囲の分コピペしてやれば上記のマクロが動くはずです。
作業列の場所を変えたい場合はマクロ内の参照箇所を自分で弄ってください。
(名無し) 2019/06/27(木) 16:18


ありがとうございます。
Y列とZ列でもよいでしょうか?
(右近) 2019/06/27(木) 17:10

名無しさん、こんばんは。遅くにすみません。
名無しさんからお教えいただいた形で、Y列とZ列に変えて、以下のように修正しました。
ところが思うような結果がでません。
このマクロを書くのは、標準モジュールで間違いないでしょうか。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim 列 As Variant
Dim 補正 As Variant
Dim 判定 As Variant
Dim 文字 As Variant
Dim 残 As Variant
列 = ActiveCell.Row - 1
判定 = LenB(StrConv(Cells(列, 3), vbFromUnicode))
文字 = Cells(列, 25).Value
残 = Replace(Cells(列, 26).Value, " ", "")

If 判定 >= 71 Then
If 列 = 35 Or 列 = 68 Then
補正 = 3
Else
補正 = 1
End If

Cells(列 + 補正, 3) = 残
Cells(列, 3) = 文字
End If

End Sub
(右近) 2019/06/27(木) 23:28


おはようございます。
標準モジュールではなく、シートそのものに書くのですね。
ただ、望んだ結果になりません。
35文字以上の文字を入力しても次の行に入らないのです。
どこに誤りがあるのでしょうか?
ちなみに名前を以下のように修正しました。同じシートに別のマクロがあるためです。
Private Sub Worksheet_Change_1(ByVal Target As Range)
(右近) 2019/06/28(金) 05:48

>どこに誤りがあるのでしょうか?

ちなみに名前を以下のように修正しました。同じシートに別のマクロがあるためです。
↑により自ら台無しにした為です。

VBA Changeイベント というキーワードでネット検索することをオススメします。

(もこな2) 2019/06/28(金) 08:57


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.