[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『データのみの転記』(謙治)
お世話になります。
Sheets("伝票入力")の範囲("a37:y42")をコピーして Sheets("転記先")に貼り付けています。
しかし("a37:y42")に全てデータがあるときは問題ないのですが、
例えば37行目から39行目迄のデータがある場合でも、転記先へ貼り付けした場合には37行目から42行目までが貼り付けされます。(データがないデータがない行の次の行から貼り付けされます。(余白の次の行から貼り付け
されています。)
*次の伝票入力データを転記先に貼り付ける場合には、余白をはずして
前回の最後のデータがある、次の行から貼り付けるように出来ませんで
しょうか?
行も薄いグレーで囲まれています。)
問題は、次の伝票入力のデータを転記先に貼り付けする場合、
マクロのコードは、下記の通りです。よろしくお願いします。
Sub tenki()
Sheets("伝票入力").Range("a37:y42").Copy
Sheets("転記先").Range("a1000").End(xlUp).Offset(1). _ PasteSpecial Paste:=xlPasteValuesAndNumberFormats, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False
Application.CutCopyMode = False Sheets("伝票入力").Activate Sheets("伝票入力").Range("c2").Select
Application.ScreenUpdating = True
End Sub
< 使用 Excel:Excel2013、使用 OS:Windows10 >
もしかして、伝票入力のA37:A42は数式が入っていて空白にしているとか?
>行も薄いグレーで囲まれています。)
これはちょっと意味がわかりませんけど。 (tora) 2020/07/06(月) 19:20
行も薄いグレーで囲まれています。 この意味は、コピーをする時に範囲を選んだ時の囲いです。それが貼り付けの時に出ています。ということで
す。
よろしくお願いします。
(謙治) 2020/07/06(月) 20:42
それであれば、貼り付けた先は空白に見えても文字列が入っています。 Sub tenki2()
Dim i As Long For i = 37 To 42 If Sheets("伝票入力").Range("A" & i).Value <> "" Then Sheets("伝票入力").Range("A" & i).Copy Sheets("転記先").Range("a1000").End(xlUp).Offset(1). _ PasteSpecial Paste:=xlPasteValuesAndNumberFormats End If Next i
Application.CutCopyMode = False Sheets("伝票入力").Activate Sheets("伝票入力").Range("c2").Select Application.ScreenUpdating = True ' End Sub
上のコードはA列の37行目から42行目までが空白でない場合のみコピーします。 (tora) 2020/07/06(月) 21:12
>上のコードはA列の37行目から42行目までが空白でない場合のみコピーします。
A列の37行目から40行目までが数値が入り41、42行目をわざと空白にして
上記コードを実行しましたら4行目分が転記先に貼り付けされました。
同じく次のデータをコード実行しましたら、その前に40行迄のデータが貼り付けられた
次の行からうまく続けて貼り付けられています。
それがうまく行けば今度は、コピー元の範囲("a37:y42")を上記コードのどこに
書けば宜しいのかすみませんが教えて頂けますか?
(謙児) 2020/07/07(火) 00:13
したがって、今回のようなケースでは貼付時の時になんとかするのではなくコピーするときに何とかしたほうが良いと思います。
例えば、すでに提案があったようにA列が""以外だったらその行はコピーの対象にするとか
Sub さんぷる壱() Dim MyRNG As Range Dim i As Long Stop 'ブレークポイントの代わり
'▼””じゃなかったらその行を覚える With Worksheets("伝票入力").Range("A37:Y42") For i = 1 To .Rows.Count If .Cells(i, 1).Value <> "" Then If MyRNG Is Nothing Then Set MyRNG = .Rows(i) Else Set MyRNG = Union(MyRNG, .Rows(i)) End If End If Next i End With
'▼覚えたセル範囲があったらコピペする If Not MyRNG Is Nothing Then MyRNG.Copy Worksheets("転記先").Range("A1000").PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False End If End Sub
A37:Y42の範囲内で後ろから""じゃないセルを探して、37〜そのセルの行までを対象にする
Sub さんぷる弐() Dim MyRNG As Range Stop 'ブレークポイントの代わり
'▼逆順で値が""じゃないセルを探す Set MyRNG = Worksheets("伝票入力").Range("A37:Y42").Find(What:="*", LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlPrevious)
'▼セルが見つかったらA37〜Y列のその行までをコピペする If Not MyRNG Is Nothing Then Worksheets("伝票入力").Range("A37:Y" & MyRNG.Row).Copy Worksheets("転記先").Range("A1000").PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False End If End Sub
などのアプローチもアプローチも有効な気がします。
(どちらもコンパイルエラーにならないことしかチェックしてないのでミスっていたらごめんなさい。)
(もこな2 ) 2020/07/07(火) 02:12
サンプル1,2どちらも試したのですが、
データが4行分あるものを転記しましたら
転記先は、1000行からデータが貼り付けされました。
次にデータを1行分転記しましたら1000行に上書きされました。?
(謙児) 2020/07/07(火) 06:13
理解してるなら、貼り付ける部分は↓だなってわかると思いますが・・・・
Sheets("転記先").Range("a1000").End(xlUp).Offset(1). _ PasteSpecial Paste:=xlPasteValuesAndNumberFormat
(もこな2 ) 2020/07/07(火) 06:56
1、下記、?@コードは、A1000に貼り付けされるような感じがしまして
見よう見まねで?AならばA1000行から上に上がっていくような感じがしまして置き換え実行しました。
最初、4行のデータを実行しましたら一番上に貼り付けされ
次のデータ2行を実行しましたら空白を無視して4行目のデータの次に表示されました。
次のデータも同じに貼り付けが詰めてされています。
ということで、置き換えたコードを使っていいのでしょうか?
?@Worksheets("転記先").Range("A1000").PasteSpecial Paste:=xlPasteValuesAndNumberFormats 'Application.CutCopyMode = False
?ASheets("転記先").Range("a1000").End(xlUp).Offset(1). _ PasteSpecial Paste:=xlPasteValuesAndNumberFormats, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False
Application.CutCopyMode = False
2、?@Stop 'ブレークポイントの代わり は、どういう意味を持つのでしょうか?
?A上記マクロコードをf8でたたいて行きますとここで止まります。
VBAの項目で実行(ユーザーフォームの実行)をクリックしますと動きます。
マクロ名をボタンを作りますとそのボタンをクリックする時には一旦止まることはないでしょうか?
(コードの置き換えが面倒なのでうまく行ったらボタンを作るつもりでした)
3、下記、コードの意味を教えて頂けないでしょうか?
If .Cells(i, 1).Value <> "" Then
If MyRNG Is Nothing Then Set MyRNG = .Rows(i)
以上、宜しくお願いします。
(謙児) 2020/07/07(火) 07:03
>理解してるなら、貼り付ける部分は↓だなってわかると思いますが・・・・
言われる通りですが、VBAのコード作成は、素人でよくわかりません。
もこな2様が作ったコード全体が正しいと思っていましたから置き換えて実行しましたら
1000行に止まって初めて気づきました。すみませんでした。
?ASheets("転記先").Range("a1000").End(xlUp).Offset(1). は、以前使っていましたので
ここだけは、覚えていただけです。
失礼しました。
お返事お待ちしています。
(謙児) 2020/07/07(火) 07:14
>?ASheets("転記先").Range("a1000").End(xlUp).Offset(1). _
PasteSpecial Paste:=xlPasteValuesAndNumberFormats, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False
Application.CutCopyMode = False
(謙児) 2020/07/07(火) 07:20
■1
>Stop 'ブレークポイントの代わり は、どういう意味を持つのでしょうか?
そのまま、「ブレークポイント」の代わりです。
ステップ実行して研究いただくために、わざと一時停止するようにしています。
「ブレークポイント」とは
https://www.tipsfound.com/vba/01010
https://www.moug.net/tech/exvba/0150019.html
「ステップ実行」とは
https://www.239-programing.com/excel-vba/basic/basic023.html
http://plus1excel.web.fc2.com/learning/l301/t405.html
■2
>A1000に貼り付け〜
>Sheets("転記先").Range("a1000").End(xlUp).Offset(1). は、以前使っていましたので
>ここだけは、覚えていただけです。
"使っていた”、"ここだけは、覚えていた"というのが理解できているという意味なのかわかりませんが、よく理解できていなかったとすれば↓を読んでみてはどうでしょうか?
http://www.niji.or.jp/home/toru/notes/8.html
https://excel-ubara.com/excelvba1/EXCELVBA318.html
http://officetanaka.net/excel/vba/tips/tips130.htm
■3
>下記、コードの意味を教えて頂けないでしょうか?
ステップ実行して動きをチェックしてみてください。
なお、MyRNGに何が格納されているかチェックしたい場合は、ローカルウィンドウで調べてみるとか、イミディエイトウィンドウに↓のように入力するとよいと思います。(何も格納されていない(≒Nothingだと)とエラーになりますが)
?MyRNG.Address
(もこな2 ) 2020/07/07(火) 08:20
読んでいる時は、少し理解出来ますがそれを覚えることは沢山あって難しそうですね。
しかし色々調べるところがあるのですね。
追って確認をしていきます。
本当に有難うございました。
(謙児) 2020/07/07(火) 09:07
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.