前回以下のようなコードを教えていただきましたが、この変換を複数列で使えるようにするにはどうしたらいいのでしょうか?
D,G,N,Q,X,AA,の列に効かせたいのですが。
Private Sub worksheet_change(ByVal Target As Range)
If Intersect(Target, Columns(1)) Is Nothing Or Selection.Count <> 1 Then Exit Sub
Dim str As String
str = Target
Application.EnableEvents = False
If Target <> "" Then
If Len(str) = 7 Then
Target = Left(str, 5) & "A" & Mid(str, 6, 1) & "-" & Right(str, 1)
Else
Target = Left(str, 5) & "A" & Mid(str, 6, 2) & "-" & Right(str, 1)
End If
End If
Application.EnableEvents = True
End Sub
No.5ベストアンサー
- 回答日時:
こんにちは。
お邪魔します。まず、
http://oshiete.goo.ne.jp/qa/7601020.html
http://oshiete.goo.ne.jp/qa/7743169.html
という一連の流れでいうと、
最初の質問が解決した段階で、本来"ユーザー定義"の表示形式の課題ではなかったと思います。
今回のご質問までくると、対象セルの表示形式は、"文字列"のほうが良いということになります。
(まだしも表示形式:"標準")
覚えのない変更で煩わされる日が来ることの無いよう、一旦、変更済の表示形式を
適宜統一しておいた方がよいかと思います。
その際、表示形式変更後に、対象セルを目視で選択→F2キー→Enterキーのようにひとつずつ直す必要があります。
ただ、
もしも、条件として、
文字列の長さが7~8のセルだけを対象として限定できるならば、より簡単に処理できます。
また、コードそのものの信頼性を高めることが出来ます。
フォーマット前の文字列の長さが7~8という条件に合うなら、
フォーマット済の文字列は必ず9文字以上の長さになりますから、下のコードの
If nLen >= 7 Then
を
If nLen >= 7 And nLen <= 8 Then
または
If nLen > 6 And nLen < 9 Then
という具合に換えてみてください。
全セルを丸ごとコピーして、そのまま丸ごと貼りつけても、必要なセルだけをフォーマットします。
余計な心配でしょうけれど、今後の運用を考えた時に
If nLen >= 7 Then
など、処理を限定する記述に注意を払わないと、
もしも、"123456"のように6桁の数字だった時とかに
もしも、フォーマットの指定文字が"A"の代わりに"D"や"E"を使うような変更があったりすると
文字列ではなく、指数になってしまいますから、注意して運用してください。
その他、
セルの消去、結合セルの有無、複数領域の値変更、など、一通り、確認済です。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tmp As Variant
Dim r As Range
Dim nLen As Long
Application.EnableEvents = False
On Error Resume Next ' ' 運用に合わせて適宜指定 ↓
For Each r In Application.Intersect(Target, Range("A:A,D:D,G:G,N:N,Q:Q,X:X,AA:AA"))
tmp = r.Value
nLen = Len(tmp)
If nLen >= 7 Then r.Value = Left(tmp, 5) & "A" & Mid(tmp, 6, nLen - 6) & "-" & Right(tmp, 1)
Next r
On Error GoTo 0
Application.EnableEvents = True
End Sub
ご質問に関しては以上です。
Re:other
///
Selection の使い方がおかしいです。Target なのでは?
///
イベントプロシージャとか名前付き引数とかに限っては
大文字小文字を区別して書くようにしませんか?
ご回答ありがとうございます。
確かに題名のユーザー定義云々は中身と違ってきてしまっていましたね。
前回のつながりで同じ題名を引きずってしまいました。
難しいことは分からず、コピペして、何となく出来てしまえばいいといった考えでしたが、
このように応用していく必要が出てくるといろいろ勉強にもなります。
これからもお世話になるかと思いますが、その節はまた宜しくお願いいたします。
No.4
- 回答日時:
続けてお邪魔します。
一つ気になるコトがあるのですが・・・
※ 確認です ※
お示しのコードはA列が対象列なので、
「A」を表示する!
という意味なのでしょうか?
そうであれば今回の質問だと対象列の列番号、
仮にG列であれば 「A」の部分を「G」と表示するという解釈になります。
その場合はコードも変わってきます。
ちょっと気になったので、お邪魔してしまいました。m(_ _)m
いいえ、A列だからAというのではありません。
横に並べたページの表の同じ列に、同じことをしたいということでした。
ありがとうございます。
No.3
- 回答日時:
No.2です!
投降後に気づきました。
前回はQ列が抜けていました。
すでにお判りだと思いますが、Q列を追加して
If Intersect(Target, Range("D:D,G:G,N:N,Q:Q,X:X,AA:AA")) Is Nothing Or _
Selection.Count <> 1 Then Exit Sub
に訂正してください。
何度も失礼しました。m(_ _)m
No.2
- 回答日時:
こんばんは!
>If Intersect(Target, Columns(1)) Is Nothing Or Selection.Count <> 1 Then Exit Sub
の部分を
If Intersect(Target, Range("D:D,G:G,N:N,X:X,AA:AA")) Is Nothing Or _
Selection.Count <> 1 Then Exit Sub
に変更してみてください。
今回のように対象範囲が飛び飛びの場合は、カンマで指定範囲を区切れば対応できます。
尚、余計なお世話かもしれませんが、仮に列が続いている場合は
Range ("B:C,E:F") ←B列・C列とE・F列の場合
のような感じになります。m(_ _)m
ありがとうございます。ネットでいろいろ調べて最初にこんな感じでやってみて出来なかったとおもったのですが、
マクロを有効にしないで試していたのかもしれません。またやってみたら出来ました。
ありがとうございました
No.1
- 回答日時:
次のようにすればよいでしょう。
A列も加わった条件で書いています。
Private Sub worksheet_change(ByVal Target As Range)
If Target.Column = 1 Or Target.Column = 4 Or Target.Column = 7 Or Target.Column = 14 Or Target.Column = 17 Or Target.Column = 24 Or Target.Column = 27 Then
Dim str As String
str = Target
Application.EnableEvents = False
If Target <> "" Then
If Len(str) = 7 Then
Target = Left(str, 5) & "A" & Mid(str, 6, 1) & "-" & Right(str, 1)
Else
Target = Left(str, 5) & "A" & Mid(str, 6, 2) & "-" & Right(str, 1)
End If
End If
End If
Application.EnableEvents = True
End Sub
この回答への補足
ご回答ありがとうございます。
入力して変換は出来るのですがDeieteした時に「実行時エラー13 型が一致しません」と出てしまいます。何か対処法はありますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) 【再投稿】VBAで動作しなくて困っています 2 2022/10/11 11:05
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Excel(エクセル) エクセルのイベントプロシージャーでF列の最終行のセルの入力をトリガーにしたいのですが 1 2022/10/14 09:36
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでの6ヶ月平均の出し方
-
エクセルで非表示行を抜かして...
-
複数のセルと複数のセルの入力...
-
エクセルで条件をつけて図形を...
-
エクセルVBA 作業後に選択範囲...
-
ワードで、グレーの部分しか入...
-
VBAでのユーザフォームの表示有...
-
メフィスト賞の応募歴は無しだ...
-
GetAsyncKeyState() を利用する...
-
別のフォームで記述している関...
-
Excel vba 条件分岐 空白セルが...
-
ACCESSで別DBにあるクエリを...
-
PHPで最も近い緯度経度をDBデー...
-
ascW関数の結果がおかしい
-
Google Mapsを利用して屋根の面...
-
エクセル マクロ 別シートから...
-
ipad 初回起動時 端末認証設定
-
緯度と経度をグーグルMAPに入れ...
-
GoogleMapAPI ズームレベルと縮...
-
HTMLタグについてお詳しい方に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで条件をつけて図形を...
-
エクセルでの6ヶ月平均の出し方
-
エクセルで非表示行を抜かして...
-
月末日に、各月の合計温度を出す
-
VBA ピポットテーブル 前年比の...
-
Excelで連番が増えるごとに数式...
-
複数のセルと複数のセルの入力...
-
エクセルVBA 作業後に選択範囲...
-
別のフォームで記述している関...
-
Switchのわんことあそぼ、めざ...
-
ワードで、グレーの部分しか入...
-
Sub Auto_Open() 実行されない
-
VBAでのユーザフォームの表示有...
-
ポケモンカード
-
ACCESSで別DBにあるクエリを...
-
認証コードの入力の仕方教えて...
-
GetAsyncKeyState() を利用する...
-
GPS位置情報で2点の中間地点の...
-
フルスクリーンモードで開いたP...
-
ascW関数の結果がおかしい
おすすめ情報