Excelにて、コピーして特定セルに張り付けると、特定セルに追番で数字が
入るマクロに下記内容を追加したいのですが、どのように追加修正してよいのか
分からず苦慮しております。
現在は、A~Kを使用しており、Dにコピーしたデーターを貼り付けるとKのセル
に1~追番で数字が入力されます。
sheet1行目には、項目名があり 2行目から入力となります
追加項目
15行以内をコピーしてD列に貼り付けたら、今まで通り追番で数字が入り
15行以上であれば15行毎に+1するようにしたい。
例えば、61行貼り付けたとすると
1~15行は今まで通り、16~30行目は15行目の数字に+1
31~45行は、30行目の数字に+1
46~60行は、45行目の数字に+1
という具合に、15毎に、K列に追番で数字を入れたい。
説明が下手ですみません
お分かりになられる方ご教授願います。
現在のコード
Private Sub Worksheet_Change(ByVal Target As Range)
Dim no As Long
Dim rng As Range
If Target.Row = 1 Or Target.Column <> 4 Then Exit Sub
If Range("K5").Value = "" Then
no = 1
Else
no = Range("K" & Cells(Rows.Count, "K").End(xlUp).Row).Value + 1
End If
Application.EnableEvents = False
For Each rng In Target
If rng.Value = "" Then
rng.Offset(0, 7).Value = ""
Else
rng.Offset(0, 7).Value = no
End If
Next rng
Application.EnableEvents = True
End Sub
No.2
- 回答日時:
こんにちは
>1~15行は今まで通り、16~30行目は15行目の数字に+1
31~45行は、30行目の数字に+1
46~60行は、45行目の数字に+1 その後も15行ごとに+1
説明と少し違うような気がしますが思い違いと思うので
16行目以降の処理は 例として
If rng.Value = "" Then
rng.Offset(0, 7).Value = ""
Else
If rng.Row > 15 Then
no = Application.RoundUp(rng.Row / 15 - 1, 0)
rng.Offset(0, 7).Value = no + Range("K15").Value
Else
rng.Offset(0, 7).Value = no
End If
End If
Next rng
ご質問を取り違えているかも知れませんが、こんな感じでどうでしょう。
No.3
- 回答日時:
#2
例として挙げましたが
no = Application.RoundUp(rng.Row / 15 - 1, 0)
整数部分を作るより、よく使うのはこちらかも、、整数部分を取り出す
no = Int((rng.Row - 1) / 15)
-1は16行目からなので
No.4
- 回答日時:
連投失礼します。
補足ありがとうございます
画像を見るとご質問に示されているコード処理と結果が違うと思うのですが、
If Range("K5").Value = "" Then
no = 1
2度目の貼り付け(青)の時 K5は””ですよね。
なので 1となるのではないでしょうか?Else の
no = Range("K" & Cells(Rows.Count, "K").End(xlUp).Row).Value + 1
は、実行されないと思いますが、いかがでしょう?
If Range("K4").Value = ""と変えてみては?
いずれにしても、
回答は、15行より上の処理は触っていません。
ただ、やはりなさりたい事を理解できていなかったと言う事のようですね
>61行貼り付けたとすると1~15行は今まで通り
16行目以降はすでに示した通りですが、2行目から15行目は
一度にペーストするとすべてに1が入るコードになっていると思うのですが
61行をペーストした時に2行目から15行目はどのようになるのですか?
コードからしか判断できませんので、期待する結果を教えてください。
16行目以降の処理結果は 31~45行は、30行目の数字に+1などと
同じだと思いますので
16~30行目は15行目の数字に+1
31~45行は、15行目の数字に+2
46~60行は、15行目の数字に+3
と言う考え方です。
一応、プロシージャを(画像も)ご確認ください。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim no As Long
Dim rng As Range
If Target.Row = 1 Or Target.Column <> 4 Then Exit Sub
If Range("K4").Value = "" Then
no = 1
Else
no = Range("K" & Cells(Rows.Count, "K").End(xlUp).Row).Value + 1
End If
Application.EnableEvents = False
For Each rng In Target
If rng.Value = "" Then
rng.Offset(0, 7).Value = ""
Else
If rng.Row > 15 Then
no = Int((rng.Row - 1) / 15)
rng.Offset(0, 7).Value = no + Range("K15").Value
Else
rng.Offset(0, 7).Value = no
End If
End If
Next rng
Application.EnableEvents = True
End Sub
No.5
- 回答日時:
こんばんは、
思っていたのと大分違っていたようで、、
For Each rng In Target からのrng相対位置を取得する方法が、、どうだったか、
ちょっと思考放棄をしてループを変えてしまいました。
お好みでないかも知れませんが、上記(思考放棄部分)を調べてみてください。
処理自体は、こんな感じで良さそうですが、どうでしょう。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim no As Long
Dim i As Long
If Target.Row = 1 Or Target.Column <> 4 Then Exit Sub
If Range("K5").Value = "" Then
no = 1
Else
no = Cells(Rows.Count, "K").End(xlUp).Value + 1
End If
Application.EnableEvents = False
For i = 1 To Target.Count
If Target(i).Value = "" Then
Target(i).Offset(0, 7).Value = ""
Else
If i > 1 And Int(i - 1) Mod 15 = 0 Then
no = no + 1
End If
Target(i).Offset(0, 7).Value = no
End If
Next i
Application.EnableEvents = True
End Sub
ちょっと、酔いが、、違っていたら
Else
If i > 1 And Int(i - 1) Mod 15 = 0 Then
no = no + 1
End If
Target(i).Offset(0, 7).Value = no
End If
の部分だと思いますので考えてくださいね。
No.6
- 回答日時:
こんにちは
13エラーですか、考えられるのは+1をしようとしているセルの値が
""だったり文字など四則演算出来ないケースだと思うのですが、
K列の下の方に関数式や文字入力の残りなど無いですか?
ちなみに
no = Range("K" & Cells(Rows.Count, "K").End(xlUp).Row).Value + 1
でもエラーになると思うのですが、、
違う原因だったらごめんなさい。
想定対応としてK列のTarget行から下を一度クリアーするなど、、
いや、ちょっと雑な気がします
数値が入っている事を検証して+1するとか、、数値でなければ
更にそのセルから.End(xlUp)・・
VBAで上行から数値が振られていく処理ならば、(空白行が出来ないのなら)
考え方を変えて 下記の様にするとどうでしょう。
仕様に合わなくなるようでしたら、検討が必要ですが
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, no As Long: no = 1
If Target.Row = 1 Or Target.Column <> 4 Then Exit Sub
If Range("K5").Value <> "" Then
no = Range("K5").End(xlDown).Value + 1
End If
Application.EnableEvents = False
For i = 1 To Target.Count
If Target(i).Value = "" Then
Target(i).Offset(0, 7).Value = ""
Else
If i > 1 And Int(i - 1) Mod 15 = 0 Then no = no + 1
Target(i).Offset(0, 7).Value = no
End If
Next i
Application.EnableEvents = True
End Sub
No.7ベストアンサー
- 回答日時:
エラーの想定できる原因、回避のヒントは#6に書いた通りですが、
仕様が解らないので実際にどのようにすれば良いか、、
ファイルをどのように弄っているのか、、、
表中の値を削除や書き直しなどされるのかとか、、K列のみ手入力で値を操作(文字、関数 入力や空白など)したりするとか
>入力した内容を取り消したりすると次に貼り付けると13エラーがでます。
エラーが出る時のセルの値は何でしょう?
ブレイクポイントを設けるとかイミディエイトウィンドウで確認するとかしてデバッグしましょう。
今までのコードで問題が発生していないのなら
no = Range("K" & Cells(Rows.Count, "K").End(xlUp).Row).Value + 1
に書き替えればエラー箇所まで同じになると思いますが、、
ご質問部分以外を変えたのが悪かったのかも知れません。
If Target.Row = 1 なども気になるのでもう一度全部で考えて
K列該当セルの値が数値でなければ+1されないようにしたものです
+1にする必要がある場合は、さらに上行方向に値が数値のセルまで
ループして探すとかになると思います。
表中の行の場合、K列一番下の数値に出来る行が+1対象です。
そのセルの値が数値に出来ない値の場合、+1されません。(1が入る)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long, no As Long: no = 1
Dim Rng As Range
If Target.Row < 5 Or Target.Column <> 4 Then Exit Sub
If Range("K5").Value <> "" Then
Set Rng = Range("K" & Cells(Rows.Count, "K").End(xlUp).Row)
If IsNumeric(Rng) Then
no = Rng.Value + 1
End If
End If
Application.EnableEvents = False
For i = 1 To Target.Count
If Target(i).Value = "" Then
Target(i).Offset(0, 7).ClearContents
Else
If i > 1 And Int(i - 1) Mod 15 = 0 Then no = no + 1
Target(i).Offset(0, 7).Value = no
End If
Next i
Application.EnableEvents = True
End Sub
エラーも出ず、思い通りに動いてくれました
ありがとうございます。
丁寧に対応して頂き感謝しております。
ありがとうございました(^^♪
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) VBAで重複した値のセルに色付けをしたい 1 2022/11/02 16:12
- Excel(エクセル) VBA 特定の列に入っているテキストをコピペ 2 2023/06/14 11:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
for whichの使い方
-
There is not/ There is noの違い
-
エクセルVBAでEdate関数は使え...
-
次の並べ替え問題を教えてくだ...
-
誰か教えてください
-
0 Degrees
-
教えて下さい!
-
イェイイェイイェイ イェイイェ...
-
no + 名詞 は、単数?複数?
-
knowledge on, about, of
-
ain't no ~を教えてください。
-
英語ができる方、問題をお願い...
-
There is no such thing as
-
NO WAR NO ABE
-
VBA Scripting.Dictionary 連想...
-
「特になし」を英語で書くとき
-
All hat and no cattle.という...
-
no signal
-
lodged securities と register...
-
noの後の語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
for whichの使い方
-
「no+比較級」の2つの異なる...
-
エクセルVBAでEdate関数は使え...
-
誰か教えてください
-
no matter how close we are to...
-
「特になし」を英語で書くとき
-
no other~について
-
knowledge on, about, of
-
There is not/ There is noの違い
-
次の並び替え問題を教えてくだ...
-
イェイイェイイェイ イェイイェ...
-
英語で「もう2~3日待ってくだ...
-
I’m not younger than you are ...
-
UNI EN ISO 14001
-
戦争反対を英語で?
-
イマジンの歌詞のまちがい?
-
changeとexchangeのちがい
-
英語ができる方、問題をお願い...
-
there is no way to do/of doin...
-
I don't knowを I don't no と...
おすすめ情報
ありがとうございます。
説明不足ですみません
添付しました画像は、現状の動作です(NOがK列です)
追加したいのは、画像最後であれば
16行分を貼り付けたら前の数字が3なので4が入り
15行分が4となり16行分は5が入るようにしたいです
次に張り付けると6から始まります
分かりにくくてすみません
ありがとうございます。
説明不足ですみません
必ず同じ数字が15個並ぶのではなく、15行以上あるときに
15行毎に+1
61行貼り付けたとすると
1~15行は今まで通り、16~30行目は15行目の数字に+1
31~45行は、30行目の数字に+1
46~60行は、45行目の数字に+1
となる様にしたいです
最初の画像は、説明用でした
ごめんなさい
K5からデータが入力されます
遅くまでありがとうございます。
新しくファイルにコードを入力して実行してみました
思い通りに動いてくれました。実際に使用しているファイルに
コードをいれて動かしてみるとエラーとなってしまします。
なぜだか分かりません
エラー画像添付します
貴重な時間対応して頂きありがとうございます
色々試してみました
回答5で回答頂いたコードで動作したのですが、
別ファイル(Aとします)からデーターをコピーして、ファイル(Bとします)貼り付けているのですが
※Bファイルの今回コードを入れています。
Bファイルで、例えば手入力でD行に入力するとK行に数字が入ります。
入力した内容を取り消したりすると次に貼り付けると13エラーがでます。
※貼り付けは、マクロで行っています(Aファイルの内容をコピーしてBファイルに
貼り付けるマクロです)
※特にファイルを触らずに動作せれば思い通りの動作です
一度エラーが出ると貼り付けつたびに13エラーが出でしまい何度繰り返してもダメです
なぜなのかわかりません