• ベストアンサー

エクセル セルの入力文字数固定

エクセル2002を使用しております。 ワードのように何行何文字というレイアウトで作業したいのですが、 1セルあたりの入力文字数を固定し、それ以上の場合は次の下セルへ自動的に送られるようなことはできますでしょうか? 書式設定の折り返しの場合は、1セルに複数行になってしまいますが、1セル1行という感じです。 現在は、折り返に設定にして、下行とセルの結合をして2行セル分にしていますが、この設定を自動化することはできますでしょうか? どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

#4です。若干手直しさせていただきました。下記は20文字に設定した時の実行例です。半角全角混在の時は、やはり見苦しいですね。 下記の通りマクロを登録した後、ワークシートの画面に戻って(再度ALT+F11)、Sheet1の任意のセルに、20文字以上の文を入力してみてください。 A列 1 数値入力の時におかしくなるので若干修正し 2 ました。下記は20文字区切りに設定した時 3 の実行例です。例えば、A1セルにズラズラ 4 と入力すると、20文字毎に区切って下のセ 5 ルに書込み、最終セルを編集状態にします。 6 マクロの登録の仕方を念のために説明すると 7 、ALT+F11を押すと、VBEdito 8 r画面に切り替わります。画面左下に、プロ 9 ジェクト VBA projectというフ 10 レーム?が表示されていてその中に、She 11 et1(Sheet1)とあるので、そこに 12 マウスカーソルを当てて右クリックし、コー 13 ドの表示を実行すると、広いフレームにカー 14 ソルが移動しますので、下記のコードを貼り 15 付けてください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim targetString As String Dim divResult As Long Dim remain As Long Dim i As Long Const limitLength As Long = 20 If TypeName(Target.Value) <> "String" Then Exit Sub Application.EnableEvents = False targetString = Target.Value If Len(targetString) > limitLength Then divResult = Len(targetString) \ limitLength remain = Len(targetString) Mod limitLength For i = 1 To divResult If i = 1 Then Target.Value = Left(targetString, limitLength) Else Target.Offset(i - 1, 0).Value = Mid(targetString, limitLength * (i - 1) + 1, limitLength) End If Next i If remain > 0 Then Target.Offset(divResult, 0).Value = Mid(targetString, limitLength * divResult + 1, limitLength) Target.Offset(divResult, 0).Activate Else Target.Offset(divResult, 0).Activate End If SendKeys "{F2}" End If Application.EnableEvents = True End Sub

hakase09
質問者

お礼

#4 mitarashi様 本日無事実行できました!うれしい! ありがとうございます。 また丁寧な作業方法までレクチャしていただきまして お礼の言葉もありません。 多くの方々のご指導により 作業時間が大幅に縮小できそうです。 また新しいメニューコマンドも知ることができました。 この場をお借りして質問の回答を下さいました方々に 心よりお礼申し上げます。

その他の回答 (4)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.4

Excelに多くを望みすぎる発想が面白かったので、試しに作ってみました。 10文字単位に分割して、余りの文字のセルに移動し、編集状態にします。 全角も半角も一文字扱いですので、実用的ではないと思います。 また、新規入力の場合に限ります。既存の文字まで考慮しようとすると、エディターを開発(大げさ)することになってしまいそうです。 Excel2000のコードですので、上位バージョンでの動作は?です。 シートモジュールに記述してください。 エラーが発生したらとにかく抜けるいい加減な作りです(^^;) Private Sub Worksheet_Change(ByVal Target As Range) Dim targetString As String Dim divResult As Long Dim remain As Long Dim i As Long Const limitLength As Long = 10 Application.EnableEvents = False On Error GoTo ErrorHandle: targetString = Target.Value If Len(targetString) > limitLength Then divResult = Len(targetString) \ limitLength remain = Len(targetString) Mod limitLength For i = 1 To divResult If i = 1 Then Target.Value = Left(targetString, limitLength) Else Target.Offset(i - 1, 0).Value = Mid(targetString, limitLength * (i - 1) + 1, limitLength) End If Next i If remain > 0 Then Target.Offset(divResult, 0).Value = Mid(targetString, limitLength * divResult + 1, limitLength) Target.Offset(divResult, 0).Activate Else Target.Offset(divResult, 0).Activate End If SendKeys "{F2}" End If ErrorHandle: Application.EnableEvents = True End Sub

hakase09
質問者

お礼

まったくもって素人の思いつきでお恥ずかしい限りです(^^;) 入力しながら改セルができると、文字数を意識しながら作業できそうなので便利そうです。 しかし、関数といえば「合計」しか使ったことがないものですから、 結果はもうしばらくお待ち下さい。必ず結果を報告させていただきます。 とりいそぎ、回答のお礼まで。 ありがとうございます。

回答No.3

#1です。 作業列が必要ですが、関数でのやり方もあります。 A1に該当の文字列があるとして、例えば10文字単位で区切りたい場合。 =MID($A$1,10*(ROW(A1)-1)+1,10) これを下にフィルすると10文字単位で区切れるはずです。 #1の回答のお礼につけてくださった、「1ラインずつ…」という意味がちょっと分からなかったのですが、区切り位置は列に対して有効です。 ※A1:A5を選択で区切り位置の指定は可能という意味です。 10文字単位で区切る場合は、区切り位置を10,20の場所に入れればOKです。

hakase09
質問者

お礼

フォローありがとうございます。 ご推察の通りの問題で躓いておりましたが、 区切り位置は複数指定できたんですね。 まったくもって頭が固かったです。 また、関数ですが、関数を使ったことがないので現在トライしております。取り急ぎお礼まで。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

データー入力規則ー文字列(身次数指定) でより小さいー文字数 でセルの文字数のオーバーを監視できます。 これ以上は、質問のニーズは特殊すぎて適応した操作設定はありません。 エクセルは文章作成ソフトではないのでやむをえないでしょう。 入力文字数を入力の瞬間に捉えるのもVBA(APIを使わぬ範囲)などでは難しいと思う。

hakase09
質問者

お礼

早速の回答、ありがとうございます。 質問しておいてなんですが、やはりおっしゃるとおり、文章作成ソフトの仕事ですね。 しかし、エクセルをスケジュールと既存の見積書にしか使わない者にとって、「データ」というメニューコマンドは大変勉強になりました。 本当にありがとうございます。

回答No.1

入力文字に対して、自動的に下セルへ…というのは残念ながら不可能だと思います。 マクロを組めば何とかなるかもしれませんが。 少し手間はかかりますが、何回か作業工程が分かれてもいいなら データ→区切り位置で、 「スペースによって…」を選択して、固定長でセルを分割した後、 該当のセルを選択→編集→切り取り→形式を選択して貼り付け→ 「行列を入れ替える」にチェックを入れて貼り付け とかはどうでしょう?

hakase09
質問者

お礼

早速の回答本当にありがとうございます。 そうですね、文字送りが必要ならば、ワードを使うべきですよね。 しかし、固定長でセルを分割 というコマンドは非常に興味深いもので、今後に応用がききそうですね。 残念ながらこの方法だと1ラインごとにやらないといけないようですが(エクセル2002だからでしょうか?)、応用できるかどうか検討させていただきます。 ありがとうございました。

関連するQ&A