VBAでセルのコピーをすると、エラーになる

このQ&Aのポイント
  • =IF(COUNTIF('5月'!B4:I13,E13)=0,"",COUNTIF('5月'!I:I,E13))というセルをコピーして、別のシートのセルに貼り付けたのですが、値が「0」の場合「””」がセルに張り付いてしまい、その後の計算ができません。
  • 質問者はVBAを使用して特定の条件に基づいてセルをコピーしたいと考えています。しかし、コピーすると値が「0」の場合には空のセルが貼り付けられてしまいます。これを解決する方法についてアドバイスを求めています。
  • VBAを使用してセルをコピーする際に、値が「0」の場合に空のセルが貼り付けられてしまうという問題が発生しています。この問題を解決する方法についてアドバイスをお願いします。
回答を見る
  • ベストアンサー

VBAでセルのコピーをすると、エラーになる

=IF(COUNTIF('5月'!B4:I13,E13)=0,"",COUNTIF('5月'!I:I,E13))というセルを コピーして、別のシートのセルに貼り付けたのですが、値が「0」の場合「””」が セルに張り付いてしまい、その後の計算ができません。 「””」を本当の空欄にするにはどうしたらいいのでしょうか? Sub 転記() Dim sh1 As Worksheet Dim sh2 As Worksheet Dim SN As String SN = Month(Now()) Set sh1 = Sheets(SN) Set sh2 = Sheets("差出票") sh1.Range("A35").End(xlUp).Offset(1) = sh2.Range("B9") sh1.Range("A35").End(xlUp).Offset(0, 1) = sh2.Range("F13") sh1.Range("A35").End(xlUp).Offset(0, 2) = sh2.Range("F14") sh1.Range("A35").End(xlUp).Offset(0, 3) = sh2.Range("F15") sh1.Range("A35").End(xlUp).Offset(0, 4) = sh2.Range("F16") sh1.Range("A35").End(xlUp).Offset(0, 5) = sh2.Range("F17") sh1.Range("A35").End(xlUp).Offset(0, 6) = sh2.Range("F18") sh1.Range("A35").End(xlUp).Offset(0, 7) = sh2.Range("F19") End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.10

>シート「差出票」=当日郵送するレターの数を表示し、郵便局へ出します。F13セルに >=IF(COUNTIF('5月'!I:I,E13)=0,"",COUNTIF('5月'!I:I,E13)) >シート「5」のB4からJ34までは郵便の数が入るので、「””」が入っているとその後の計算に支障があります。 >=SUM(B12*$B$3,C12*$C$3,D12*$D$3,E12*$E$3,F12*$F$3,G12*$G$3,H12*$H$3) という式をL12に入れています。 という事だけが問題なのであれば、差出票!F13セルの関数を =IF(COUNTIF('5月'!I:I,E13)=0,0,COUNTIF('5月'!I:I,E13)) とすれば良い様な気も致しますが、それでは駄目なのでしょうか?  或いは、L12セルの関数を =SUM(SUM(B12)*$B$3,SUM(C12)*$C$3,SUM(D12)*$D$3,SUM(E12)*$E$3,SUM(F12)*$F$3,SUM(G12)*$G$3,SUM(H12)*$H$3) とすれば、""が入っていてもエラーとはならずに計算が行われます。  後、 =SUM(B12*$B$3,C12*$C$3,D12*$D$3,E12*$E$3,F12*$F$3,G12*$G$3,H12*$H$3) の様に、一々、セルの組み合わせを1組ずつ記述せずとも、 =SUMPRODUCT(B12:H12*$B$3:$H$3) とすれば、セル範囲で指定する事が出来ます。  但し、これだけでは""が入力された際にエラーとなってしまいますので、 =SUMPRODUCT((0&B12:H12)*$B$3:$H$3) の様にする事で、B12:H12のセル範囲の中に""が入っているセルが存在していてもエラーとはならずに計算を行う様にする事が出来ます。  但し、こちらの方は""が入力されている場合限定であり、""ではない普通の文字列データが入力された際にはエラーが出ます。  尤も、幾ら上記の関数で計算が出来る様になったとしましても、""が残っていたままでは、後から別の関数を付けたす場合や、別のマクロでEnd(xlUp)などを使用して最終行を求める場合などに、思わぬ悪影響が出る事になり、しかも見かけは空欄のセルにしか見えないため、トラブルが起きた際の原因究明が困難になる恐れもありますので、やはり""は全て無くしてしまうようにした方が良いかも知れません。

kisaragijec
質問者

お礼

kagakusukiさん、ありがとうございます。 =SUMPRODUCT((0&B12:H12)*$B$3:$H$3) こんな関数があったんですね! で、0&とすることで空欄のエラー回避となるのですね。 あと、SUM関数で空欄のエラー回避ができると聞いていたのですがすべての数値につけるのですね。 どおりで、エラーになるわけです。 大変勉強になりました。 「””」のかわりに、「0」ということですが、見た目ごちゃごちゃしていて たんなる私の好みで空欄になるようにしてみました。 どうしても無理だったら0表示させようかと思っていました。 今のところ、関数で希望のものができるのですが、やはり、後々悪影響がでないように、空欄になるマクロを利用させていただきます。 ありがとうございました。

その他の回答 (9)

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.9

>>"を""で書きなさいってのは、この「式」に対して適用される話なので、 >>左と右で適用できる変数が違ってくるんで、コピーは不可能なんです。 >がわからなくて、悩んでいます。 では Temp = sh2.Range("B9").value Msgbox Temp sh1.Range("A35").End(xlUp).Offset(1).value = Temp として、中間の結果を確認してみてください。 で、その中間の結果をどこかに sh1.Range("X1").value = Temp や sh1.Range("X1").Formula = Temp として貼り付けてみてください。そうすると、どういう動きをしてるかわかる と思いますよ。プログラムはそういった「途中でどうなってるか」を逐次 確認するのがキモです。 実行は[F8]でステップ実行し、貼り付け直後に止めてしまえば問題ない ですよね。VBAはこうやって中間結果を見ながら作業できるのがいいん です。 まさか、ステップ実行せず、いきなり初めから動かしたりしてませんよね?

kisaragijec
質問者

補足

FEX2053さん、ありがとうございます。 もちろん、いきなり初めから動かしてました。。。 こんなふうにステップ実行するのですね。 すごく勉強になりました。 どの数字をコピーしたのかもわかり、納得できました。 ただ、「””」は、表示されなくて、空白に見えるからやっかいです。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.8

 済みません。  回答No.7で提示させて頂いた方のVBAは間違っておりました。 >sh1.Range("A35").End(xlUp).Offset(0, 1)    ~ >sh1.Range("A35").End(xlUp).Offset(0, 7) に関しては、""が貼り付けられていても構わない、という条件に基づいて、sh2.Range("F13:F19")の値を一気に貼り付ける場合には、やはり[形式を選択して貼り付け]を使った方が良いようです。(処理対象が7セル程度ですので、処理速度の点でFor~Nextを使用するのとどちらが早いのかは微妙ですが) Sub 転記_条件緩和() 'QNo.8973647VBAでセルのコピーをすると、エラーになる Dim sh1, sh2 As Worksheet Dim myValue As Variant Set sh1 = Sheets(month(Now()) & "") Set sh2 = Sheets("差出票") With sh1.Range("A35") myValue = sh2.Range("B9").Value If IsError(myValue) Then myValue = Empty If Len(myValue) > 0 Then .End(xlUp).Offset(1).Value = myValue sh2.Range("F13:F19").Copy .End(xlUp).Offset(0, 1).PasteSpecial Paste:=xlPasteValues, Transpose:=True End With Application.CutCopyMode = False End Sub

kisaragijec
質問者

補足

kagakusukiさん、お返事が遅れてすみません。 差出票!B9セルには、日付が入っています。 このファイルは、後納郵便を出すときに、 シート「5月」=3行目に日付、宛先、料金、担当者、内容物が入っています。Iには、当日郵送するレターの料金を表示する関数を入れました。 =IF(B10=差出票!$B$9,'5月'!D10,0) シート「差出票」=当日郵送するレターの数を表示し、郵便局へ出します。F13セルに =IF(COUNTIF('5月'!I:I,E13)=0,"",COUNTIF('5月'!I:I,E13)) シート「5」=3列目に日付、82、92、120・・・と普通郵便の料金を表示しています。 なので、郵便物がない日は、マクロを動かさないので、差出票!B9セルには必ず日付が入っています。 シート「5」のB4からJ34までは郵便の数が入るので、「””」が入っているとその後の計算に支障があります。 =SUM(B12*$B$3,C12*$C$3,D12*$D$3,E12*$E$3,F12*$F$3,G12*$G$3,H12*$H$3) という式をL12に入れています。 私の返事が遅れたため、せっかく考えていただきましたがこちらのマクロでは動かないです。 申し訳ございません。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.7

 ちょと気になっている事があるのですが、マクロで処理する前の状態において、A35セルから上にあるセルの内、データが入力されている一番下のセルが例えばA20セルであったとして、差出票!B9セルに何か値が入力されていた場合には、 sh1.Range("A35").End(xlUp).Offset(1) = sh2.Range("B9") に相当する処理を行いますと、新たにA21セルが一番下のセルという事になりますので、差出票!F13:F19の値を貼り付けるセルはB21:H21のセル範囲という事になります。  それに対して、差出票!B9セルが空欄又は""であった場合には、一番下のセルはA20のまま変わりませんので、差出票!F13:F19の値を貼り付けるセルはB20:H20のセル範囲という事になります。  その様な処理をしたいという事なのでしょうか?  それとも、マクロによる処理を行う前の一番下のセルが例えばA20セルであった場合には、差出票!B9セルが空欄であるか否かには関係なく、必ずB21:H21のセル範囲に差出票!F13:F19の値を貼り付けるという事なのでしょうか?  どちらなのか良く解りませんでしたが、御質問文に書かれているVBAの処理が「差出票!B9セルが空欄であるか否かによって、貼り付け先が変わる」様な形式となっていたため、取り敢えず回答No.5のマクロでも、そうなる様にしております。  ですからもし、マクロによる処理を行う前の一番下のセルが例えばA20セルであった場合には、差出票!B9セルが空欄であるか否かには関係なく、必ずB21:H21のセル範囲に差出票!F13:F19の値を貼り付ける様にされたい場合には、その旨を御知らせ願います。  それと、おそらくは心配する様な事ではないかも知れませんが、 >そもそも””なら貼り付けないか という処理の仕方ですと、万が一、マクロで値の貼り付けを行う前に、貼り付け先のセルに何か値が入力されていた場合には、貼り付け先のセルに古いデータが残ったままになる恐れがありますので注意して下さい。  後それから、もしも >「””」を本当の空欄にする という処理が必要になるのは sh1.Range("A35").End(xlUp).Offset(1) だけであり、 sh1.Range("A35").End(xlUp).Offset(0, 1)    ~ sh1.Range("A35").End(xlUp).Offset(0, 7) に関しては、""が貼り付けられていても構わない、などという"条件であれば"、VBAをもっと単純かつ高速にする事が出来ます。 Sub 転記_条件緩和() 'QNo.8973647VBAでセルのコピーをすると、エラーになる Dim sh1, sh2 As Worksheet Dim SN As String Dim myValue As Variant SN = Month(Now()) Set sh1 = Sheets(SN) Set sh2 = Sheets("差出票") With sh1.Range("A35") myValue = sh2.Range("B9").Value If IsError(myValue) Then myValue = Empty If Len(myValue) > 0 Then .End(xlUp).Offset(1).Value = myValue .End(xlUp).Offset(0, 1) .Resize(1,7).Value = sh2.Range("F13:F19").Value End With End Sub

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.6

>sh1.Range("A35").End(xlUp).Offset(1) = sh2.Range("B9") このやり方のコピーでやってることは、変数Tempを介して >Temp = sh2.Range("B9").value >sh1.Range("A35").End(xlUp).Offset(1).value = Temp ってことです。要は「値貼り付け」なんですね。 で、本来、式をセルに貼り付けるには >sh1.Range("A35").End(xlUp).Offset(1).Formula = 式 って処理が必要なんです。 "を""で書きなさいってのは、この「式」に対して適用される話なので、 >sh1.Range("A35").End(xlUp).Offset(1) = sh2.Range("B9") このやり方では、左と右で適用できる変数が違ってくるんで、コピーは 不可能なんです。 なので、原点に戻ってコピーコマンドを使って sh1.Range("A35").End(xlUp).Offset(1).Copy sh2.Range("B9") とすれば動くんではないかと思います。この場合、元の式は↓のままで 正解です。だって「Excelの機能を使ってコピーをやってる」んですから。 =IF(COUNTIF('5月'!B4:I13,E13)=0,"",COUNTIF('5月'!I:I,E13)) ちなみに、ちゃんとしたコピーについてはこちらを。 http://officetanaka.net/excel/vba/cell/cell09.htm

kisaragijec
質問者

補足

FEX2053さん、ありがとうございます。 >sh1.Range("A35").End(xlUp).Offset(1).Copy sh2.Range("B9") ではなくて、 sh2.Range("B9").Copy sh1.Range("A35").End(xlUp).Offset(1) なのですが、値の貼付けではなく、すべて貼付けになってしまいました。 それはいいのですが、 >"を""で書きなさいってのは、この「式」に対して適用される話なので、 >左と右で適用できる変数が違ってくるんで、コピーは不可能なんです。 がわからなくて、悩んでいます。 ””がどこにもない? 変数が違ってくるというのもよくわからないです。コピーできているので・・・。 超初心者ですみません。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 確認したいのですが、 >値が「0」の場合 の「値」とは、 COUNTIF('5月'!B4:I13,E13) の部分の計算結果の事であって、 =IF(COUNTIF('5月'!B4:I13,E13)=0,"",COUNTIF('5月'!I:I,E13)) という関数全体の計算結果が0という意味では無い訳ですよね?  そして、 COUNTIF('5月'!B4:I13,E13) の部分の計算結果が0だった場合には、元のセルの値が""という「文字数が0の文字列データ」となっていて、本当の意味での空欄ではなくなっているため、後で別の処理を行う際に、.End(xlUp)などの類の処理を行うと正しい最終行が得られないといった類の問題があるので、本当の空欄にするにはどうすれば良いのかというのがこの質問の趣旨ではないかと思います。  次の様にされては如何でしょうか。 Sub 転記_改() 'QNo.8973647VBAでセルのコピーをすると、エラーになる Dim sh1, sh2 As Worksheet Dim SN As String Dim CopyCell, PasteCell As Range Dim i As Long Dim myValue As Variant SN = Month(Now()) Set sh1 = Sheets(SN) Set sh2 = Sheets("差出票") myValue = sh2.Range("B9").Value Set PasteCell = sh1.Range("A35").End(xlUp).Offset(1) GoSub label1 With sh1.Range("A35").End(xlUp) For i = 1 To 7 myValue = sh2.Range("F12").Offset(i).Value Set PasteCell = .Offset(0, i) GoSub label1 Next i End With Exit Sub label1: If IsError(myValue) Then myValue = Empty If Len(myValue) = 0 Then myValue = Empty PasteCell.Value = myValue Return End Sub

kisaragijec
質問者

お礼

以下の内容で補足します。よろしいですか? kagakusukiさん、今回もありがとうございます。 前回は、途中で締め切られてしまい、ベストアンサーにできなくてすみません。 今回の私のつたない説明で理解していただきありがとうございます。 おっしゃるとおりです。 なので、マクロもばっちりスムーズに動きました。

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.4

私の下手な説明より、こちらの方が的確に説明できていると思います。 ぜひご一読ください。 http://officetanaka.net/excel/vba/tips/tips90.htm たぶん、'をどう見てるかの問題ではないかと・・・。 ちなみに上記サイトは本当にいろいろタメになるので、ぜひ通読を。

kisaragijec
質問者

補足

FEX2053さん、サイト見ました。 たぶん、理解できたとおもうのですが、・・・=0,"""",・・・ではできませんでした。 FEX2053さんはできたのですよね? こちらの方法で空欄になれば一番うれしいのですが、これ以上の説明は難しいでしょうか? =IF(COUNTIF('5月'!B4:I13,E13)=0,"",COUNTIF('5月'!I:I,E13))ですが =IF(COUNTIF('5月'!I:I,E13)=0,"",COUNTIF('5月'!I:I,E13))の間違いでした。 すみません。

  • FEX2053
  • ベストアンサー率37% (7987/21355)
回答No.3

=IF(COUNTIF('5月'!B4:I13,E13)=0,"",COUNTIF('5月'!I:I,E13)) こういつは、こうすれば動きます。 =IF(COUNTIF('5月'!B4:I13,E13)=0,"""",COUNTIF('5月'!I:I,E13)) .Formulaで貼り付けるときは、"で文字列の終わりと判断してしまうので そういう結果になるんです。回避するには"の代わりに""を使ってください。 なので=""ではなく、=""""になるんです。

kisaragijec
質問者

補足

FEX2053さん、ありがとうございます! こういう素敵な方法があるのですね! でも、「”」がひとつ表示されてしまいます。 書いていただいた関数をそのままコピペしたのですが・・・。 なぜだかお分かりになりますか? よろしくお願いします。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

>「””」を本当の空欄にするには そもそも””なら貼り付けないか,あるいはご相談で書かれてるように貼り付けてしまったあとでどうかしたいなら,削除するしかありませんね。 if sh2.range("B9").value <> "" then sh1.Range("A35").End(xlUp).Offset(1) = sh2.Range("B9")  以下同じ

kisaragijec
質問者

お礼

keithinさん、希望通りに動きました♪ ありがとうございました。

noname#207526
noname#207526
回答No.1

それは、数式をコピーしているからです。違う結果を求めるならば、編集から値をコピーなどの特殊コピーをするべきでしょう。

kisaragijec
質問者

補足

alsranさん、早速のお返事ありがとうございます。 http://officetanaka.net/excel/vba/cell/cell09.htm 上記のHPより、 Sub Sample4() Range("C2") = Range("A1") End Sub で、値の貼り付けができるとありました。 「””」は値です。 数式ではないとおもうのですが? 初心者の為、失礼がありましたらお許しください。

関連するQ&A

  • ロートルの初心者です、VBAについての質問です。

    エクセル2003で以下のVBAを色々な資料を基に、「テスト2」のシートに条件検索されたデータ、マクロ起動(?)で「入力履歴」に追記されるものを作成しました。 Sub prog() Dim myFld As String, myCri As String Dim myRow As Long Dim Sh2 As Worksheet, Sh3 As Worksheet Set Sh2 = Worksheets("テスト2") Set Sh3 = Worksheets("入力履歴") With Sh2 myRow = .Range("D" & Rows.Count).End(xlUp).Row Range("A1:H" & myRow).Copy Destination:=Sh3.Range("A" & Rows.Count).End(xlUp).Offset(1) End With Sh3.Activate Range("A1").Select End Sub ここで問題となるのが抽出データには関数が含まれているため「入力履歴」シートに書き込まれたデータにもそのまま貼り付けられるので「#A/N」となってしまいます。 Range("A1:H" & myRow).Copy Destination:=Sh3.Range("A" & Rows.Count).End(xlUp).Offset(1)の 「Destination」を変えれば良いかと思ったのですが・・・、うまくいきません。 エクセルでいう、「形式を選択して貼り付け→値」をやりたいのですが書き方がわかりません。 ロートルの初心者によろしく愛の手をお願い申します。 PS:説明文があると助かります。

  • Excel VBAについて

    Excel VBAについて教えて頂きたいのですが、 Sub test() Dim lastrow, r, i As Long Dim sh1, sh2 As String Dim ws As Worksheet lastrow = Cells(Rows.count, "D").End(xlUp).row For r = 7 To lastrow '7 For i = 1 To lastrow '4 sh1 = ActiveSheet.Cells(r, 4) ActiveSheet.Cells(r, 20) = _ Application.CountIfs(Sheets(sh1).Range("D:D"), Range("H3") & Range("I3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("D:D"), Range("H3") & Range("I3")) ActiveSheet.Cells(r, 21) = _ Application.CountIfs(Sheets(sh1).Range("C:C"), Range("F3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("C:C"), Range("F3")) ActiveSheet.Cells(r, 22) = _ Application.CountIfs(Sheets(sh1).Range("E:E"), Range("K3"), Sheets(sh1).Range("K:K"), "<=3") _ / Application.CountIf(Sheets(sh1).Range("E:E"), Range("K3")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") ActiveSheet.Cells(r, 15) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") - 200 ActiveSheet.Cells(r, 18) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) Sheets(sh1).Range("A3:R3").AutoFilter Field:=4, Criteria1:=Range("H3") & Range("I3") + 200 ActiveSheet.Cells(r, 19) = Application.Subtotal(105, Sheets(sh1).Range("O:O")) For Each ws In Worksheets ws.AutoFilterMode = False Next Next Next End Sub このコードは ActiveSheetで実行すると D列の7行目から最終行までに入力されている名前のシート(名前=シートがあります) その、シートの参照先で C,D,E列がcountif関数を利用して O列がSubtotal関数を利用しています。 このコードでもやりやいことは実行できるのですが、 時間がかかりすぎてしまいます。 約20件あり約2分ほどかかります。パソコンによっては倍ほど時間がかかるかもです。 そこでなのですが、 もっと処理のスピードを上げたいのですが、 可能でしょうか? 可能ならそのやり方をご教示ください。 よろしくお願い致します。

  • EXCEL2010エラーVBA

    下記を実行するとエラーになりEXCEL2010が終了してしまいます。 fDebug:0 offset00009391 がエラーメッセージです。 何が原因でしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Dim rg As Range Dim r As Variant Dim c As Long Dim hanni1 As Range Dim atai As Range Set ws = Worksheets("あああ") Set rg = Worksheets("コード").Range("A1:B10") r = ws.Cells(Rows.Count, 1).End(xlUp).Row Set hanni1 = ws.Range(Cells(2, 2), Cells(r, 3)) Set atai = ws.Range(Cells(2, 3), Cells(r, 3)) atai = Application.VLookup(hanni1, rg, 2, False) End Sub

  • ExcelVBA データのコピー範囲について

    あけましておめでとうございます。今年もよろしくお願いします。 Sub Test() Dim myTarget As Range, r As Range, f Set myTarget = Sheets("Sheet1"). _    Range("B2", Sheets("Sheet1").Range("B65536").End(xlUp)) For Each r In myTarget  Set f = Sheets("Sheet2").Columns(1). _    Find(r.Value, Sheets("Sheet2").Range("A1"), Lookat:=xlWhole)  If Not f Is Nothing Then    If r.Offset(0, 3).Value <> f.Offset(0, 3).Value Then      f.Resize(1, 4).Copy Destination:= _      Sheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0)    End If  End If Next r End Sub 前回の質問で教えていただいたコードなのですが、現時点では、B列のデータを元にして二つのSheetのデータを比較して別Sheetへコピーしているのですが、そのときに、B列以降の(たとえば、B列からX列まで)データはコピーできますが、A列もコピーしたい時はどうすればよいのかで、悩んでいます。どの様に変更すればよいのでしょうか?

  • エクセルVBAで実行時エラー 91 が出ます

    エクセル2000です 各部署の棚卸を纏める為のVBAを作成しているのですが、実行時にエラーになってしまいます エラーメッセージは 「実行時エラー 91   オブジェクト変数またはWithブロック変数が設定されていません」 です ご教授お願いいたします Sub 棚卸() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("在庫集計票") Set sh2 = Worksheets("棚卸表") x = sh2.Range("A65536").End(xlUp).Row Z = sh1.Range("d2").Value ’部署番号 sh1.Range(Cells(5, Z), Cells(3000, Z)).ClearContents For i = 2 To x y = sh1.Range("A2:A" & Range("A2").End(xlDown).Row). _ Find(sh2.Cells(i, "a")).Row ’ここでエラーが発生します sh1.Cells(y, Z) = sh2.Cells(i, "c") Next i End Sub

  • 最終セルまでデータを反映させるマクロ

    あるサイトからの利用コードです。 それをアレンジしようとしましたが、つまずきました。 マクロコードをご教示ください。 あるフォルダに複数のエクセルファイルがあります。 構成が同じシート(名前は同じ。仮に "各シート")を、 別ブック(仮に "まとめ")の一つのシートに纏めます。 その時、複数ファイルの D4のデータだけは "まとめ"ブックのL列に反映させたいのですが、 下記コードを使用すると、どこにどのようなコードを入れたら良いのでしょうか? 因みに複数ファイルの8行目からコピーされ、 複数ファイルのCからM列は まとめブックのAからK列に反映されるようになってます。 (まとめブックの1行目は見出し) Dim i As Integer Dim strPath As String Dim strFileName As String Dim WB1 As Workbook Dim WS1 As Worksheet Dim WS2 As Worksheet Dim lngRowCount As Long Set WS2 = Sheets("まとめ") strPath = ThisWorkbook.Path strFileName = Dir(strPath & "\*.xls*") Do While strFileName <> "" If strFileName <> ThisWorkbook.Name Then Set WB1 = Workbooks.Open(strPath & "\" & strFileName) Set WS1 = WB1.Sheets("各シート") With WS1.Range("C7") lngRowCount = .Worksheet.Cells(.Worksheet.Rows.Count, .Column).End(xlUp).Row - .Row If lngRowCount >= 1 Then With .Resize(lngRowCount, 11).Offset(1) .Copy WS2.Range("A" & WS2.Rows.Count).End(xlUp).Offset(1) End With End If End With _____ここで つまずく_____    With WS1.Range("D4")     .Copy WS2.Range("L" & WS2.Rows.Count).End(xlUp).Offset(1)     WS2.Range("L" & WS2.Rows.Count).End(xlUp).AutoFill Destination = Range("E1048576").End(xlUp).Row _____ここまで つまずく_____ WB1.Close False End If strFileName = Dir Loop End Sub エクセル2013です。 宜しくお願い致します。

  • エクセルのVBAコードにつてい

    以下のコードについて、その内容をまだ自分の知識では理解できず困っておりまして、アドバイスいただければと思いまして書き込みました。 『コード』 Sub Test() Dim Lc As Integer Dim Ct As Integer Dim MyR As Range Dim C As Range Dim D As Range Lc = Range("A1").End(xlToRight).Column - 2 For Each C In Range("B2", Range("B65536").End(xlUp)) Ct = WorksheetFunction.Count(C.Offset(, 1).Resize(, Lc)) If Ct > 0 Then Set MyR = C.Offset(, 1).Resize(, Lc).SpecialCells(2, 1) For Each D In MyR With Sheets("Sheet2").Range("A65536").End(xlUp) .Offset(1).Value = C.Value .Offset(1, 1).Value = Cells(1, D.Column).Value End With Next Set MyR = Nothing End If Next With Sheets("Sheet2") .Columns("A:B").AutoFit .Activate End With End Sub 『質問』 1.「Lc = Range("A1").End(xlToRight).Column - 2」の部分の解釈は「A1から右方向に一番最後のセルまでを範囲指定し、その一番右のセルの列番号を取得する」変数という解釈でいいのか 2.「Ct = WorksheetFunction.Count(C.Offset(, 1).Resize(, Lc))」の部分の変数はどういった値の整数を取得する変数なのか 以上2点についてアドバイスいただけると幸いです。

  • 入力用のセルと管理用のセルを分けるには??

    Private Sub Worksheet_Change(ByVal Target As Range) Dim myC As String Dim x As Range   If Intersect(Target, Range("A1,C2,D4")) Is Nothing Then Exit Sub   Select Case Target.Address(0, 0)     Case "A1": myC = "E"     Case "C2": myC = "F"     Case "D4": myC = "G"   End Select   If Cells(Rows.Count, myC).End(xlUp).Value = "" Then     Set x = Cells(Rows.Count, myC).End(xlUp)   Else     Set x = Cells(Rows.Count, myC).End(xlUp).Offset(1)   End If   x.Value = Target.Value End Sub 入力用セルと、管理用のセルを分けたい・・・・・ という質問をしてこのマクロを教えていただいたんですが、 実際には入力用にしたいセルが、40箇所以上ありまして 一つ一つ反映させるのではなく、すべての箇所に入力して確認後に まとめて反映させたいのですが不可能でしょうか?? 何か方法があるようでしたらヨロシクお願いします!! エクセル2003です。

  • VBA ループ処理 "型が違います"エラー

    "sheet1"のA1:J1を"sheet2"のA1:J1にコピー "sheet1"のA2:J2を"sheet2"のA2:J2にコピー "sheet1"のA3:J3を"sheet2"のA3:J3にコピー これを"sheet1"A:Jが空欄になるまでループさせたいのですが、 どうしてもエラーが出てしまいます。。。 前回も同様の質問をして、回答を頂いたのですが、 自分なりに応用を利かせてやってみたら、エラーが出てしまいます>< ------------------------------------------------------------ Sub cpy2() Dim i As Long Dim Sht1 As Range Dim Sht2 As Range Set Sht1 = Sheets("Sheet1").Range("A1:J1") ←("A1")ではエラーは出ません。 Set Sht2 = Sheets("Sheet2").Range("A1:J1") ←("A1")ではエラーは出ません。 For i = 0 To 65535 If Sht1.Offset(i) <> "" Then ←ここでエラーが出ます"型が違います" Sht2.Offset(i) = Sht1.Offset(i) Else Exit For End If Next End Sub -------------------------------------------------------------- 教えて下さい。お願いします。

  • Excel VBAを使った重複行の抜き出しについて教えてください

    以下のような2シートから、重複する「商品番号」のあるsheet1の行を抜き出して、別シートに書き出したいと思っております。 sheet1  |  A   |  B   | C -+--------+-------+----- 1|      |      | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3|  123456|  ガム|山田太郎 -+--------+------+-------- 4| 2345678| チョコ|田中花子 ・・・ sheet2  |  A   |  B   | C -+--------+-------+----- 1|      |     | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3| 3987624|     | -+--------+------+-------- 4| 193678|      | ・・・ そこでVBAを作成したのですが、例えば商品番号「222011001」の行を抜き出したいのに、「22011001」の行も一緒に抜き出してしまいます。 どこがいけないのか、教えて頂けないでしょうか。 作成したVBAは以下の通りです。 VBA初心者で本を見ながら作ったため、大変見にくくなっているかと思います。申し訳ありませんが、どなたかおわかりになる方がいらっしゃいましたら、どうぞ宜しくお願い致します。 Option Base 1 Option Explicit Sub 重複データ抽出書き直し() Dim シート(2) As Worksheet Dim 比較列(2) As Integer Dim 一致セル As Range Dim 検索範囲 As Range Dim i As Integer Set シート(1) = Sheets("sheet1") Set シート(2) = Sheets("sheet2") 比較列(1) = 1: 比較列(2) = 1 シート(2).Activate ActiveCell.CurrentRegion.Select Selection.Offset(1, 比較列(2) - 1) _ .Resize(Selection.Rows.Count - 1, 1) _ .Select Set 検索範囲 = Selection Sheets.Add After:=Sheets(Sheets.Count) シート(1).Activate ActiveCell.CurrentRegion.Select Selection.Resize(1).Copy With Sheets(Sheets.Count).Range("A1") If Application.Version >= 9 Then .PasteSpecial 8 End If .PasteSpecial End With For i = 2 To Selection.Rows.Count Set 一致セル = 検索範囲.Find(Selection.Cells(i, 比較列(1)).Value) If Not 一致セル Is Nothing Then Selection.Offset(i - 1).Resize(1) _ .Copy Sheets(Sheets.Count) _ .Range("A65536").End(xlUp) _ .Offset(1) End If Next i Sheets(Sheets.Count).Activate End Sub

専門家に質問してみよう