アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセル VBAでの別シートへのコピーについて教えてください。
sheet1
A列:受注日 B列:名前 C列:フリガナ D列:個数 E列:納品日 F列:担当
↓コピペ
sheet2
F列:受注日 G列:名前 H列:フリガナ I列:個数 J列:納品日 K列:担当 という風にしたいです。
今いれてるコードは
Private Sub CommandButton1_Click()
Dim maxrow As Long
Dim row As Long
Dim sh1 As Worksheet
Dim sh2 As Worksheet

Set sh1 = Worksheet("発注")
Set sh2 = Worksheet("納品済み")

ActiveCell.Resize(1,5).Copy
sh2.Select
maxrow = sh2.Cells((Rows.Cout),"G").End(xlUp).row
For row = 4 To maxrow
If sh2. Cells(row."G").Value = "" Then
sh2. Cells(row."G").Past
End If
Next
Application. CutCopyMode = False
Unload Me
End Sub
ですが、うまく貼り付けされず、空白のままです。どのようなコードを、入れたら良いのでしょうか?ご教授お願いいたします!!

ちなみにsh1のG列ダブルクリックでユーザーフォームがたちあがり、コマンドボタン1を、選択でこのコードが、起動するようにしてあります。

質問者からの補足コメント

  • ステップ イン(F8)すると、sh2.Cells(row,"G").Paste
    の部分が、とばされているのですが、ここが原因でしょうか?

      補足日時:2019/08/19 09:13
  • NO.1さんのご指摘にありました通り、
    If sh2. Cells(row."G").Value = "" Then
    sh2. Cells(row."G").Pastの箇所は、正しくは
    If sh2. Cells(row."G").Value = "" Then
    sh2. Cells(row."G").Pasteです。
    そして、先ほどの補足に入れました通り、ステップインで飛んでしまうのは、この
    sh2. Cells(row."G").Pastの部分です

      補足日時:2019/08/19 10:42
  • また間違えてます!すみません!ステップインで飛んでしまうのは
    sh2. Cells(row."G").Pasteです!

      補足日時:2019/08/19 10:43
  • スペル間違い等々ご指摘をいただきましたので、、正しくはこちらです。
    Set sh1 = Worksheets("発注")
    Set sh2 = Worksheets("納品済み")
    ActiveCell.Resize(1,5).Copy
    sh2.Select
    maxrow = sh2.Cells((Rows.Count),"F").End(xlUp).row
    For row = 4 To maxrow
    If sh2. Cells(row,"F").Value = "" Then
    sh2. Cells(row,"F").Paste
    End If
    Next

      補足日時:2019/08/22 23:04
  • Qchang1962さん
    半角入ってませんでした!すみません!
    エラーは出なくなりました!!ありがとうございます!
    あれから色々やってみて、もう一度、表を、作り直して試しています。
    実行はsh1の A列ダブルクリックに設定し、sh1の AからFを、sh2のBからGに貼り付け出来るようにしたいです。
    しかし、教えていただいたコードに置き換えてみましたが、何も貼り付けされませんでした、、、。他の方も言われていたようにmaxrowが4になるからでしょうか?
    If sh2. Cells(row, "B")=""Then
    Range("A" & ActiveCell.row & ":F"). Copy
    sh2.Cells(row, "B" ).PasteSpecial Paste:=xlPasteAll

      補足日時:2019/08/27 12:52

A 回答 (12件中1~10件)

訂正、修正が重なったので、ご質問を整理した方が良いと思います。


ペーストする先が最終行迄と言うのも、不思議な用途になるかと思います。

ダブルクリックした行のAからFまでがコピーされ、
(範囲6列)
sh2のBからGに貼り付け出来るようにしたいです。
(範囲6列)
sh2.Cells(row, "B" ).PasteSpecial Paste:=xlPasteAll
例えば
sh2.Cells(5, "B" ).PasteSpecial Paste:=xlPasteAll
なら、5行目のB列から6列ペーストされますよね。

rowを決める部分とForを考えれば良いですね。
row = 4 To maxrow
maxrow = sh2.Cells((Rows.Count),"F").End(xlUp).row
どこに矛盾があるのでしょう。
4と言う定数は何か、
sh2のF列は何の列なのか、なんでF列の最終行まで貼り付けをするのか

初めは、sheet2
F列:受注日 G列:名前 H列:フリガナ I列:個数 J列:納品日 K列:担当 という風にしたいです。
なので、
もう一度、整理しましょう。
    • good
    • 1
この回答へのお礼

何度もありがとうございます!ほんとやって行くうちに自分でもわからなくってしまっていました、、、。最終行に、貼り付けしたいのではなく、その次に貼り付けしたくて、悩んでいたのですが、結局、教えて頂いたコードに、変えsh2.Cells((Rows.Count),"F").End(xlUp).rowのところをsh2.Cells((Rows.Count),"F").End(xlUp).row+1に、変えることで上手くいきました。ほんと感謝です!!!ありがとうございます!!

お礼日時:2019/08/29 17:14

Range("A" & ActiveCell.row & ":F" & ActiveCell.row).Copy を入れてみたのですが、 ":の部分がエラーになります、、、。



なりますか?

&の前後の半角スペースありますか?そもそも、Webコピペでエラー出ませんね。
セルを複数選んでもアクティブは一つだし???ちゃんとセルをクリックしてフォームから実行してます?
私の環境で出ないので、原因は分かりません。
    • good
    • 1

No.2です。

補足やお礼を読む限り、ご自分で考えることを放棄されたように感じられ、残念です。

>4行目以下には何も入っていません。
ということは、maxrowは3になるのは理解できますか?
maxrowが3の場合、次のようなループになります。

For row = 4 To 3 Step 1

これは、rowの初期値4、増分1とした上で、rowが3を超えるまでループすることを意味します。しかし、初期値が4なので、その時点ですでに3を超えているため、即ループを抜けてしまいます。
例えば、F7セルに何らかの文字を入力して、maxrowが7になるようにしておけば、4~6行目にペーストされるはずです。
ただ、これが質問者さんの意図する結果なのでしょうか?
    • good
    • 1
この回答へのお礼

コメント遅くなり、すみません。考えることを放棄しているわけではないのですが、そのように感じられたのならすみません!
たしかにmaxrowは3に、なりますね!4かと思っていました、、、。と言う事はmaxrow = sh2.Cells((Rows.Cout),"G").End(xlUp).row
For row = 4 To maxrow
If sh2. Cells(row."H").Value = "" Then
sh2. Cells(row."H").Pastにして、G4に何かしらのデータを入れておき、H以降を貼り付けすれば上手くいくということなのでしようか?

お礼日時:2019/08/25 23:28

あと、これも



sh2.Cells(row, "F").PasteSpecial Paste:=xlPasteAll
    • good
    • 0

mahi-mahi様、修正の情報ありがとうございます。


掲示された内容からすると、原因は、先に記しましたが ActiveCell.Resize(1,5).Copyに
あります。ダブルクリックでフォームを立ち上げたのち、ActiveCellを指定していないので
>ちなみにsh1のG列ダブルクリックでユーザーフォームがたちあがり なので
G列のクリックセルがアクティブになりそのセル以降から5列がコピーされる為です。
№7で示したコードなどの置き換えを検討してみてください。
ただ、方法は色々あるので、環境や慣れ、好みで作成されるのが良いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!とても勉強になります!
教えていただいた
Range("A" & ActiveCell.row & ":F" & ActiveCell.row).Copy を入れてみたのですが、 ":の部分がエラーになります、、、。

お礼日時:2019/08/25 23:38

横からすみません。

ご質問のコードをお借りしますが

これは、実際にVBEに書かれているコードでしょうか?
タイプミスなど多数ありますが、コンパイルエラーになりませんか
また、行いたい事が不明な点が多く、コードからも矛盾がありますが
そのようなシート組なのでしょうか、
基本的にモジュールの最初に Option Explicit を記すことを勧めます。
コンパイルや変数などの不備をデバック時に教えてくれます。

では、ご質問記載のコードで確認してください。

Private Sub CommandButton1_Click()
Dim maxrow As Long
Dim row As Long
Dim sh1 As Worksheet
Dim sh2 As Worksheet

Set sh1 = Worksheet("発注")
ここは、sh1 = Worksheets("発注") です。
Set sh2 = Worksheet("納品済み")
ここは、sh2 = Worksheets("発注") です。

ActiveCell.Resize(1,5).Copy
ここが一番の問題です。
>sh1のG列ダブルクリックでユーザーフォームがたちあがり
つまり、G列がアクティブになっています。と言う事は、G列からK列がコピーされます
あれ?
>sheet1
>A列:受注日 B列:名前 C列:フリガナ D列:個数 E列:納品日 F列:担当
ですよね。であれば、
Range("A" & ActiveCell.row & ":F" & ActiveCell.row).Copy とか

Range(Cells(ActiveCell.row, "A"), Cells(ActiveCell.row, "F")).Copy です。

書き方はほかにもありますが。

sh2.Select
maxrow = sh2.Cells((Rows.Cout),"G").End(xlUp).row
ここは、Cout スペルミス
maxrow = sh2.Cells(Rows.Count, "G").End(xlUp).row

For row = 4 To maxrow
If sh2. Cells(row."G").Value = "" Then
ここは、If sh2.Cells(row, "G").Value = "" Then です
また、納品済みシートの最終行を4行の間に空のセルがあるのでしょうか?
最終行までG列が書かれているなら、空白がないので何もペーストされませんよね?

コードから見るときっと空行を埋めるのでしょう。
もし、F行を対象にしているなら If sh2.Cells(row, "F").Value = "" Then です

sh2. Cells(row."G").Past
これはちょっと気持ちが悪いと言うか
Pastはスペルミス .は , ですF行に書き込むなら "F"ですよね?
また、他のシートにすべてをペーストなら sh2.Cells(row, "F").PasteSpecial Paste:=xlPasteAll

End If
Next
Application. CutCopyMode = False
Unload Me
End Sub

コピー元の条件、書き込み先の条件があいまいです。
わざとそのように書かれているのであれば、その旨を記載すべきと思います。

この場合、列に対して確定的範囲であれば、Resizeでない方が良いかなと思います。
Resizeは、変数や配列、数式などで範囲変動する場合などに有効ですので
勿論使っても良いのですが。

なんとなく、すっきりしませんが、参考になれば幸いです。
    • good
    • 2
この回答へのお礼

お教えいただきありがとうございます!ほんとお恥ずかしいほど間違えてますね!
PCが、ネット環境など外部とのアクセス出来ない仕様になっているため、実際の VBEを、見てスマホで投稿に、なりスペル間違いだらけになってしまいました、、、。言い訳ですが、、、。実際のものをもう一度、補足に入れさせてもらいます。

お礼日時:2019/08/22 14:59

No.5です。



簡易検証しましたがコピペはちゃんとされてました。
バージョンの違いによるのかな?
うちのは2002と言うお古なので。
    • good
    • 1

No.4です。



検証せず投稿してごめんなさい。

>Set r1 = sh1.ActiveCell.Resize(1,5)

Set r1 = ActiveCell.Resize(1,5)

こうなるかな?
    • good
    • 0
この回答へのお礼

ありがとうございます!しかしやはり同じでした、、、。

お礼日時:2019/08/21 08:06

Private Sub CommandButton1_Click()


Dim maxrow As Long
Dim row As Long
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim r1 As Range

Set sh1 = Worksheet("発注")
Set sh2 = Worksheet("納品済み")
Set r1 = sh1.ActiveCell.Resize(1,5)

sh2.Select
maxrow = sh2.Cells((Rows.Cout),"G").row
For row = 4 To maxrow
If sh2. Cells(row."G").Value = "" Then
r1.Copy sh2. Cells(row."G")
Exit For
End If
Next
Unload Me
End Sub

とか?(未検証)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
実行してみましたが、
Set r1 = sh1.Active Cell.R esize(1,5)
の箇所でエラーになり、メソッドまたはデータメンバーがみつかりませんと出てしまいました、、、。

お礼日時:2019/08/20 11:14

No1です。



>sh2.Cells(row,"G").Pasteの部分が、とばされている
ご質問文には、該当部分が見当たりませんね。

>If sh2. Cells(row."G").Value = "" Then
>sh2. Cells(row."G").Past
ってのはあるけれど・・・

「Paste」と同様に、たったひと文字の違いでも異なる意味になったり、解釈できなくてエラーになったりします。
回答者にも正確な内容が伝わりません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!