[[20200706182510]] 『データのみの転記』(謙治) ページの最後に飛ぶ

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

 

『データのみの転記』(謙治)

お世話になります。

 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

tora様
早速、ご連絡頂きありがとうございます。
>もしかして、伝票入力のA37:A42は数式が入っていて空白にしているとか?
はい、式が入っています、IF文で。
しかし貼り付けは、そのまま貼り付けは、式が崩れますので、値を貼っていますので余白になっています。

行も薄いグレーで囲まれています。 この意味は、コピーをする時に範囲を選んだ時の囲いです。それが貼り付けの時に出ています。ということで
す。
よろしくお願いします。

(謙治) 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

tora様
有難うございます。

>上のコードはA列の37行目から42行目までが空白でない場合のみコピーします。
A列の37行目から40行目までが数値が入り41、42行目をわざと空白にして
上記コードを実行しましたら4行目分が転記先に貼り付けされました。
同じく次のデータをコード実行しましたら、その前に40行迄のデータが貼り付けられた
次の行からうまく続けて貼り付けられています。

それがうまく行けば今度は、コピー元の範囲("a37:y42")を上記コードのどこに
書けば宜しいのかすみませんが教えて頂けますか?

(謙児) 2020/07/07(火) 00:13


横からですが、数式で""にしている場合は、Excel君にとってはブランクセルではないのですよね。
なので、仮に空白を無視して値貼付しても""が張り付いてしまいます。

したがって、今回のようなケースでは貼付時の時になんとかするのではなくコピーするときに何とかしたほうが良いと思います。

例えば、すでに提案があったように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


もこな2様
おはようございます。
お返事、有難うございます。

サンプル1,2どちらも試したのですが、
データが4行分あるものを転記しましたら
転記先は、1000行からデータが貼り付けされました。

次にデータを1行分転記しましたら1000行に上書きされました。?

(謙児) 2020/07/07(火) 06:13


>転記先は、1000行からデータが貼り付けされました。
おっと失礼。。。と書こうとしましたが、そもそも論で一番初めに提示されたものは、ご自身で作ったあるいは理解されているのではないですか?

理解してるなら、貼り付ける部分は↓だなってわかると思いますが・・・・

  Sheets("転記先").Range("a1000").End(xlUp).Offset(1). _
       PasteSpecial Paste:=xlPasteValuesAndNumberFormat

(もこな2 ) 2020/07/07(火) 06:56


もこな2様
今、色々試してみましたが、

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


もこな2様
先程アップしようとしましたら衝突しました。
再度送った後ここのサイトをみましたら上記もこな2様からのメッセージをみました。

>理解してるなら、貼り付ける部分は↓だなってわかると思いますが・・・・
言われる通りですが、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


もなこ2様
お忙しいところ各サイトを色々調べて頂き有難うございます。
今、そのサイトを読んで試したりしているところです。
>「ブレークポイント」とは
サイトを読んで意味が分かりました。

読んでいる時は、少し理解出来ますがそれを覚えることは沢山あって難しそうですね。
しかし色々調べるところがあるのですね。

追って確認をしていきます。

本当に有難うございました。

(謙児) 2020/07/07(火) 09:07


コメント返信:

[ 一覧(最新更新順) ]


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