• ベストアンサー

エクセルVBAでセル位置の置き換え

売上帳をエクセルVBAを使って作っています。 シート自体は、    B    C     D    E 1 日付 顧客NO. 顧客名 品名 2 3 のようになっており、 B列、C列、D列の最終行に入っている値を、その一行下から、E列最終行までのB~D列全部に貼りつけたいのです。 コードは下記のように書いてあります。 Dim 行番号 Dim セル日 Dim セル客 Dim 品名行 Dim 日付行 Dim セル日2 Dim セル日3 Sub 日付と顧客名を貼付() 行番号 = Cells(Rows.Count, "B").End(xlUp).Row 'B列最終行の行番号を取得し「行番号」に代入 セル日 = "B" & 行番号 セル客 = "D" & 行番号 Range("セル日:セル客").Copy '日付と顧客番号と顧客名をコピー 品名行 = Cells(Rows.Count, "E").End(xlUp).Row 'E列最終行の行番号を取得し「品名行」に代入 日付行 = Cells(Rows.Count, "B").End(xlUp).Row + 1 'B列最終行の1行下の行番号を取得し「日付行」に代入 セル日2 = "B" & 日付行 セル日3 = "B" & 品名行 Range("セル日2:セル日3").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'B列最終行の1行下のB列からD列に値の貼り付け End Sub これを実行すると、 『Range("セル日:セル客").Copy』の部分でエラーがでます。 正しくはどのように書けばよいのでしょうか?

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

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

>Range("セル日:セル客").Copy '日付と顧客番号と顧客名をコピー ↑これでは、セル日:セル客 という単なる文字列になります。 下記のようにすれば通ると思います。 Range(セル日, セル客).Copy 5行下の Range("セル日2:セル日3").PasteSpecial Paste:=・・・・・・ でも同じことです。

yunako0517
質問者

お礼

ありがとうございます。 この方法が簡単でした。 出来ました。

その他の回答 (3)

回答No.4

簡単ですが、こういう方法もあります。 Sub 日付と顧客名を貼付2() 行番号 = Cells(Rows.Count, 2).End(xlUp).Row Range(Cells(行番号, 2), Cells(行番号, 5)).Copy Destination:=Cells(行番号 + 1, 2) Cells(2, 1).AutoFill Destination:=Range(Cells(2, 1), Cells(Cells(Rows.Count, 2).End(xlUp).Row, 1))  ' 1列に連番を振る End Sub

yunako0517
質問者

お礼

回答ありがとうございます。 こういう方法もあるのですね。 試してみます。

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.3

一例です Sub test() Dim x, y x = Cells(Rows.Count, "B").End(xlUp).Row y = Cells(Rows.Count, "E").End(xlUp).Row Range("B" & x + 1, "D" & y).Value = Range("B" & x, "D" & x).Value End Sub やっていることは同じです よ~く見比べてみてください

yunako0517
質問者

お礼

ありがとうございます。 同じ事をするのにも、いろいろな書き方があって、初心者の私は頭がパニックになりそうです。 時間をかけてしっかり理解したいと思います。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

ちなみに代入で良ければ、 Range("E1", Cells(Rows.Count, 5).End(xlUp)).Offset(, -3).Resize(, 3).SpecialCells(xlCellTypeBlanks).Value = _ Cells(Rows.Count, 2).End(xlUp).Resize(, 3).Value この1行でもいけるかも?

yunako0517
質問者

お礼

回答ありがとうございます。 やってみます。

関連するQ&A

  • エクセル vba セル合計

    添付表について下記の様な処理をしたいのですが途中からVBAの書き方が(セル合計)がわからず困っております。  *日別の原価計(K列のセル値)の小計(K列の最終入力行の下※k112)に計算する。 自分ではこの様を処理を考えております。 (1)商品名(G列)最終入力行の1行下を選ぶ(G112) (2) (1)の同行にある(k112)を合計算出セルとして選ぶ (3)商品名(G列)最終入力行(g112)からその列上の空欄行の1セル下(g66)を見て(要はg 112からEnd(xlUp))、その行と同じ範囲のK列(k112ーk66)を合計をする範囲として選ぶ (4) (2)の合計する範囲を(3)で算出する。 VBA素人の私では(1)~(3)までを下記の通り書きました。 Sub 原価合計求める() Dim lastrowshu As Long Dim lastrowgen As Long Dim fastrowgen As Long lastrowshu = Cells(Rows.Count, 7).End(xlUp).Row + 1 '帳票シートの商品名(G列)最終入力行+1を取得する。 lastrowgen = Cells(Rows.Count, 7).End(xlUp).Row '商品名行の最終入力 fastrowgen = Cells(lastrowgen, 7).End(xlUp).Row '商品名最終入力行から一番上 Cells(lastrowshu, 11).Select ここまでを実行すると添付ファイルでいうk112セルをselectするまではうまくいきましたが、 これ以降の(4)の合計の書き方がわかりません。 どなたか御教授願います。 あるいはもっといい方法があれば同時にご指導頂けますと幸いです。

  • マクロセルの値によってセルの色を消す

    エクセル2013です。 セルの値が0又は空白の場合でそのセルが色塗りされていたら色を消す というマクロをを作成しました。 ただ700行55列では処理が遅いです。 Sub 色消() '成功 Dim 最終行 Dim 最終列 Dim 対象セル As Range 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Value = 0 Or 対象セル = "" Then 対象セル.Interior.ColorIndex = 0 End If Next 対象セル End Sub 対象範囲から対象セルを全部見つけて一括処理すれば早いのではと 以下のマクロを作成してみましたが Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) で構文ERRです。 どこを直せばいいのでしょうか? よろしくお願いします。 Sub 色消2() '2014/8/4 '失敗 Dim 対象範囲 Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 対象範囲 = Range(Cells(10, 17), Cells(最終行, 最終列)) Set 対象範囲 = Cells.Find(What:=0 Or "", LookIn:=xlValues, LookAt:=xlWhole) If Not 対象範囲 Is Nothing Then 対象範囲.Interior.ColorIndex = 0 End If End Sub

  • 選択したセルの値を別シートのセルに取り込む方法

    顧客情報を閲覧・印刷するためのフォームがsheet1とします。顧客の情報が入ったデータベースがsheet2とします。 以下のマクロでsheet2の48列目を空欄にして、48列のいずれかのセルに「出力」と入力すると、そのセルの行の値を出力結果というシートに渡すようにしています。取り込んだ行の顧客番号をsheet1のmach関数の参照先に指定して、index関数で各項目に取り込むようにしています。 Worksheets("sheet2").Activate Dim i, LastRow As Long LastRow = Cells(Rows.Count, 48).End(xlUp).Row For i = 1 To LastRow If Cells(i, 48) = "出力" Then Rows(i).Copy Sheets("出力結果").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i もう少しこれを改良して、Sheet2の顧客番号の入っている1列目の任意のセルを選択して、sheet1のmatch関数の参照先(例としてK4)に選択した顧客番号を渡す方法はありませんでしょうか。sheet1は顧客番号だけ取得できれば、match・index関数でフォームが完成します。 VBAは初心者です。上記マクロは検索で調べて必要な個所をコピーして今の環境にアレンジしました。よろしくお願いします。

  • エクセルVBA

    エクセル2003です エクセルの印刷レビュ-までのマクロをおしえてください *A列からQ列までで行は1~150で伸縮します  最終行をA5より下のA列のセルに値が連続で入っている最後が最終印刷範囲行とします *罫線ありです *1ページを30行とします *2ページ目からの先頭行に(A7:Q7)を印刷に入れたい *ヘッダーは右上に日付 *フッダーは右下にページ 現状では罫線で最終行が決まってしまいます 現状コード Sub 印刷() With ActiveSheet.PageSetup .PrintTitleRows = "$7:$7" .PrintTitleColumns = "" End With ActiveSheet.PageSetup.PrintArea = Range("A1:Q1").Resize(Range("A" & Rows.Count).End(xlUp).Row).Address With ActiveSheet.PageSetup .RightHeader = "&""MS Pゴシック,太字 斜体""&14&D" .RightFooter = "&""MS Pゴシック,太字 斜体""&14&P/&N" .PaperSize = xlPaperA4 .Zoom = 75 .PrintErrors = xlPrintErrorsDisplayed End With ActiveWindow.SelectedSheets.PrintPreview End Sub 罫線ではなくA列のセルに文字列等が入っている行を最終行にしたいのですが 教えて頂けないでしょうか? 出来れば説明付きでよろしくお願いします

  • VBA 最終列に入力された値の表示について

    VBAで最終列に入力された値の表示について教えてください。 例えば10行目の10列目(J列)に”123”と入力された値をセル”D1”に表示させたいのですがどのようにすればよいのでしょうか。 A列の最終行については Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Long r = Cells(Rows.Count, 1).End(xlUp).Row Range("D1").Value = Cells(r, 1).Value End Sub でうまく表示できたのですが、最終列についてなかなかうまくいきません。 どなたかご指南ください宜しくお願いします。

  • VBA シート間の単一セルから結合セルへのコピー

    マクロについてご教授をお願いします。 ◆実現したい事 2枚のシート(XとY)が存在します。 コピー元:Xシート          コピー先:Yシート    B列                    B列 1行 商品1   コピペ→     1~3行結合 商品1  2行 商品2   コピペ→     4~5行結合 商品2 3行 商品3   コピペ→     6~8行結合 商品3   ・                    ・   ・                    ・   ・                    ・  最終行                  最終行 XシートのB列に1行ずつ、商品名が羅列されています。 YシートのB列には、3行結合(B1:B3)、(B4:B6)、(B7:B9)・・・空白セルがあります。 Xシートの商品名をYシートの結合セルにマクロを使って処理したいです。 ◆試した事 (1)結合を解除し、XからYへ範囲コピーしたが、YのB列に再び、商品毎に2行追加し、結合  2行追加する方法がわからず断念 (2).valueでXシートB1 = YシートB1を試みるができない ◆ここで詰まってます>< Dim X As Worksheet Dim Y As Worksheet Dim 最終行1 As Long Dim 最終行2 As Long Dim cp1 As Long・・・・Yシート行変数 Dim cp2 As Long・・・・Xシート行変数 Set X = Worksheets(1) Set Y = Worksheets(2) 最終行1 = Cells(Rows.Count, 2).End(xlDown).row 最終行2 = Cells(Rows.Count, 2).End(xlDown).row For cp1 = 1 To 最終行1 For cp2 = 1 To 最終行2 Step 3 sh1.Cells(cp1, 2).Copy Destination:= sh2.Cells(cp2, 2) Next Next みたいな感じにできればと、Copyを.valueなどにしてみたりと試してみましたが、 なかなかうまくいかず、3日くらい悩んでいます。 シンプルにやりたいのですが、なにか良い方法などあれば、 ご教授のほどお願い致します><

  • エクセルVBA、数式の入ったセルのコピーについて質問です。よろしくお願

    エクセルVBA、数式の入ったセルのコピーについて質問です。よろしくお願いします。 シートのA列は日付の入ったセルがあり、データを更新する度に行が追加されていきます。 数式(1)~(3)は、それぞれ異なる計算式が入っており、日付データを参照して計算を行っています。   A    B    C    D 1 日付データ 数式(1) 数式(2) 数式(3) 2 日付データ 数式(1) 数式(2) 数式(3) 3 日付データ   4 日付データ   5 日付データ   A列にデータが追加したときに、B~D列の数式をA列の最終行までコピーしたいのですが、 どのようなコードを書けばよいでしょうか? ちなみに、1行目のB~D列には、データ更新の有無に関わらず、必ず数式が入っているものとします。 何かよいアドバイスがあればよろしくお願いします。 【補足】 単純に考えると、B1~D1をA列の最終行までAUTOFILLすれば良いのでしょうが、データ数がかなり多く、 この方法だと時間がかかってしまいます。A列のデータ追加前の数式セルの最終行から、追加後の最終行までとすると、処理は早くなるのでしょうか?

  • エクセルVBA の変数を使うべきでしょうか?

    はじめまして。エクセル初心者です。 書籍やサイトで勉強させてもらっていますが、VBAがなかなか難しくてすぐに壁にぶつかってしまいます。少々困ってしまい、詳しい方のアドバイスを頂ければと質問を投稿させていただきました。 どうか宜しくお願い致します。質問ですが、 以下のようなコードで、sheet5のB列の任意のセルをダブルクリックした場合、sheet5のBCD列の同じ行のセル値がsheet1の指定した列に入力されるという処理を作りました。 これで一応目的の動作はするのですが、数が増えると「コンパイルエラー・プロシージャが大きすぎます」というメッセージがでてしまいます。列や行には規則性があるので、もしかしたら変数というものを使ってコードを書き直せばいいのかなと思いネットで調べてみたのですが、今のところさっぱり理解できません。 申し訳ありませんが、分かりやすくご教授いただけないでしょうか。バージョンは2003を使っています。 また、下のコードですと、sheet5のBCDいずれかのセルに空白があった場合、sheet1の列に入力されるときに入力される行がずれてしまいます。今は空白を何かで埋めて対処しているのですが、この問題の解決策も教えて頂けると助かります。どうか宜しくお願い致します。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Target.Address = "$B$2" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B2") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C2") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D2") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$3" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B3") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C3") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D3") Worksheets("sheet1").Activate cancel = True End If If Target.Address = "$B$4" Then Worksheets("sheet1").Range("B" & Rows.Count).End(xlUp).Offset(1).Value = Target.Value Worksheets("sheet1").Range("H" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("B4") Worksheets("sheet1").Range("K" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("C4") Worksheets("sheet1").Range("M" & Rows.Count).End(xlUp).Offset(1).Value = Worksheets("sheet5").Range("D4") Worksheets("sheet1").Activate cancel = True End If   ・     ・   ・     ・   ・     ・ End Sub

  • ExcelのVBAにおけるLastRowという言葉

     ExcelのVBAにおいて、「最終行」即ち「(その列において)データが存在しているセルの中で最も下にあるセルの行番号」を取得する必要が生じる事が良くあります。  その様な場合には、Cells(Rows.Count,列番号).End(xlUp).Row か Range(列番号 & Rows.Count).End(xlUp).Row を用いて取得するのが主流ですが、多くの場合、最終行の行番号のデータが必要になるたびに取得しなおすのではなく、最初に取得した最終行の行番号を変数に格納しておき、最終行の行番号のデータが必要な場合はその変数を使って最終行の行番号を指定するのが普通です。  その様な最終行の値を格納する変数を使用する場合、私個人の場合は「何に使用するための変数であるのかという事を解りやすい変数名を用いる」という観点から、「LastRow」という変数名を好んで用いております。  この「LastRow」という変数名はあくまでそのVBAマクロ内だけで使用されるその場限りのものに過ぎない筈です。  しかし、このサイトのExcelのVBAに関する質問を眺めていると、例えば Range(”○○")からLastRowまで ○○セルからLastRowまで といった具合に、「LastRow」という言葉があたかも「『最終行の行番号』や『最終行のセル』を表す"一般名詞"」であるかの様に使用されている質問を時々見かける事があります。  これが「last row」であれば「最後の行」という意味の英語の言葉になりますから間違いとは言えません。  それに対し「LastRow」という単語は少なくとも英語には存在しません。  それにもかかわらず、「LastRow」という言葉が前述の様な一般名詞として使われているという事は、ExcelのVBAにおいて「LastRow」という言葉は、Excelのワークシートを使った処理における「作業列」などと同様のテクニカルタームになっているという事なのでしょうか?

  • Excel vbaのClearについて

    よろしくお願いします。 Excel2003使用です。 最終行を指定して、それを使って動作をしたいのですが、、うまく動作しません。 A列~D列まで入力があり、A列の52行目からD列の最終行までをClearしたいのです。 Set ps = ThisWorkbook.Worksheets("●●") LastRow = ps.Cells(ps.Rows.Count,1).End(xlUP).Row ps.Range(Cells(52,1),Cells(LastRow,4)).Clear →Error1004がでます うまく動く方法をご存じな方、よろしくお願いします。

専門家に質問してみよう