質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1503閲覧

VBAについて「違うブックからデータを取得し行と列を入れ替える」

yoshih

総合スコア5

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/08/25 09:58

エクセルで、異なるブックからデータを取得し、行と列を入れ替えて並べ替えるVBAを書いております。
まずはfor文を構築する前に1列だけ実行しようと考え、下記のコードを書きましたがエラー402が16行目で発生しました。

セルの値を取得するためにrange("H5:AI5")とすると上手くいくのですが、for文で書くことを考え
Range(Cells(5, 8), Cells(5, 22))とcellsを使用すると上手くいきませんでした。
(後に"5"の場所をiにすればfor文ができると考えていました。)

VBA

1Sub 穴径測定結果抽出応用15() 2 3Dim Wb1, Wb2 4 Set Wb1 = ThisWorkbook 'このブック 5 Set Wb2 = Workbooks("測定結果.xlsx") '元のエクセル名を記入 6Dim LastRow As Long '最後の行 7Dim LastClm As Long '最後の列 8Dim i As Long 9Dim j As Long 10 11 '最終行、最終列を取得 12 LastRow = Wb2.Worksheets("測定結果元データ").Cells(Rows.Count, 8).End(xlUp).Row 'シート名を記入 13 LastClm = Wb2.Worksheets("測定結果元データ").Range("A1").End(xlToRight).Column 'シート名を記入 14 15 'セルの値を取得する 16 Wb2.Worksheets("測定結果元データ").Range(Cells(5, 8), Cells(5, 22)).Copy '**エラーがでる行** 17 Wb1.Worksheets("Sheet1").Cells(22, 2).PasteSpecial Paste:=xlPasteValues, Transpose:=True 'シート名を記入 18 19 20End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

何も指定しなければ、CellsやRangeはアクティブシートから取得してこようとします。

Rangeは測定結果元データであると指定しているのに、Cellsはアクティブシート(このソースではコピー先シート)を使ったのでは、一体どこを指定しようとしているのか分かりません。

つまり、Cellsも測定結果元データで指定してやる必要があります。

※複数のシートを操作する必要がある場合、CellsやRowsは必ず操作対象シートを指定することを強くお勧めします。

毎回Worksheetsから取得してくるのも何ですので、ワークシートは一度変数に受けおくなり、Withを使うなりしてやると良いでしょう。

変数に受ける場合

VBA

1Dim wsSrc As Worksheet 2Set wsSrc = Wb2.Worksheets("測定結果元データ") 3 4wsSrc.Range(wsSrc.Cells(5, 8), wsSrc.Cells(5, 22)).Copy

Withを使う場合

VBA

1With Wb2.Worksheets("測定結果元データ") 2 .Range(.Cells(5, 8), .Cells(5, 22)).Copy 3End With

投稿2021/08/25 10:23

ishina_yum

総合スコア509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshih

2021/08/26 04:29

CellsはRangeの( )内にあるため、元データで指定できていると考えておりました。ご指摘いただいたところを理解し、ワークシートを変数にすることで解決することが出来ました。 また、変数を使用したパターンとwithを用いたパターンの2つを提示していただき大変勉強になりました。 ありがとうございます。 自分の勉強不足を痛感しました。。。。
guest

0

以下のようにすると改善すると思います。

VBA

1Dim moto As Worksheet 2Set moto = Wb2.Worksheets("測定結果元データ") 3 4 '最終行、最終列を取得 5 LastRow = moto.Cells(moto.Rows.Count, 8).End(xlUp).Row 'シート名を記入 6 LastClm = moto.Range("A1").End(xlToRight).Column 'シート名を記入 7 8 'セルの値を取得する 9 moto.Range(moto.Cells(5, 8), moto.Cells(5, 22)).Copy 'RangeとCellsのSheetを一致させる 10

なお、セル範囲を指定するときに Range(rng1, rng2) という形を使うと、このエラーが起きがちです。
なので、個人的にはその書き方は避け、以下のようにすることが多いです。

VBA

1moto.Cells(5, 8).Resize(, 15).Copy

投稿2021/08/25 10:06

編集2021/08/25 10:35
jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshih

2021/08/26 04:28

reiseを使用したことがなく、初めて聞きました。 セルの範囲サイズが指定できるので非常に便利だと思いました。 使ってみるとシンプルでしたので、今後私も使用していきたいと思います。 ありがとうございました。 また便利な技を教えて頂きますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問