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

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

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

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

Q&A

解決済

4回答

1506閲覧

VBA 特定のブックのセルの値によって、別のブックのセルに入力したい

msys1987

総合スコア2

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

0グッド

0クリップ

投稿2020/06/02 02:33

編集2020/06/02 03:02

前提・実現したいこと

あるフォルダの中に同じフォーマットでブック名が異なる日報のExcelが20個ぐらいあります。
それぞれのExcelから必要な部分のみ抽出して1つのExcelにまとめるプログラムを書いております。

その日報のExcelの特定のセルに"有り"と入力されていた時に、まとめているExcelの特定のシートに-500000と入力をさせたいのです。

発生している問題・エラーメッセージ

ファイル名を取得する際に以下のエラーが表示され止まってしまいます。

エラーメッセージ
実行時エラー '9'
インデックスが有効範囲にありません。

該当のソースコード

Sub test() Application.ScreenUpdating = False Dim file As String file = Dir(ThisWorkbook.Path & "*本体材料費*") Do While file <> "" Dim wb As Workbook Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & file) Sheets("本体材料費明細提出用(新仕切併用)").Select Dim i As Long For i = 22 To 36 If Not Cells(i, 2) = "" And Not Cells(i, 2) = HasFormula Then Range(Cells(i, 15), Cells(i, 45)).Select Selection.Copy Exit For End If Next i ThisWorkbook.Activate Dim x As Long For x = 22 To 123 If Cells(x, 2) = wb.Sheets("本体材料費明細提出用(新仕切併用)").Cells(i, 2) Then Cells(x, 15).PasteSpecial Paste:=xlPasteValues Exit For End If Next x ** '以下のコードでエラーが発生します。 If Workbooks(file).Sheets("商品名A").Range("AD28").Value = "有り" Then** Cells(x, 37).value = -500000 End If Workbooks(file).Close savechanges:=False file = Dir Loop Application.ScreenUpdating = True MsgBox "コピー完了しました。" End Sub

試したこと

If Workbooks(file).Sheets("商品名A").Range("AD28").Value = "有り" Then**

If Workbooks**(ThisWorkbook.Path & "" & file).Sheets("商品名A").Range("AD28").Value = "有り" Then

にしましたが、同様の現象でした。

解決方法を教えていただけないでしょうか。

よろしくお願いいたします。

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

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

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

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

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

hatena19

2020/06/02 02:48 編集

コードは、コードブロックに入れてください。 コードを選択して、ツールバーの<code>ボタンをクリックです。
hatena19

2020/06/02 02:59 編集

あるいは、下記をコピーしてコードを入力してください。 ```vba ここにコードを入力 ```
guest

回答4

0

「商品名A」シートがあるのかまず確認。
あと折角Openしてwbにブックオブジェクトが入っているのだからそれを使いましょう。

VBA

1If Workbooks(file).Sheets("商品名A").Range("AD28").Value = "有り" Then 23If wb.Sheets("商品名A").Range("AD28").Value = "有り" Then

Closeも同様です。

投稿2020/06/02 04:09

ttyp03

総合スコア16998

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

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

0

Sheets("商品名A")がうまく認識していないのかも知れません。
Sheets("商品名A")を、Worksheets("商品名A")に代えるとどうでしょうか?

投稿2020/06/02 03:45

kenshirou

総合スコア772

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

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

0

自己解決

エラーの原因がわかり、解決いたしましたので記載いたします。
みなさんの投稿から、見たいセルを見に行くコードは間違いえていない可能性が高いと思ったので
同じフォルダの中にある日報のブックを見返してみました。
AD28セルですが、AL28までセルが統合されており、それを解除したところ正しく動作するようになりました。

そこで
If Workbooks(file).Sheets("商品名A").Range("AD28").Value = "有り" Then**

If wb.Worksheets("商品名A").Range("AD28").MergeArea(1, 1).Value = "有り" Then
にした所、正しく動作するようになりました。

情報不足と確認不足でもうしわけありません。
回答いただきありがとうございました。

投稿2020/06/02 05:38

編集2020/06/02 05:44
msys1987

総合スコア2

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

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

0

Excelコーディングのスキルアップの第一歩は、
アクティブなオブジェクトを対象に処理をするというコーディングから卒業することです。
つまり、SelectやSelectionを使わないということです。

Office TANAKA - VBA高速化テクニック[Selectしない]

提示のコードを上記の方針が書き替えたコード例です。

vba

1Sub test() 2 3 Application.ScreenUpdating = False 4 5 Dim file As String 6 file = Dir(ThisWorkbook.Path & "*本体材料費*") 7 8 Do While file <> "" 9 10 Dim wb As Workbook 11 Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & file) 12 13 Dim ws As Worksheet 14 Set ws = wb.Worksheets("本体材料費明細提出用(新仕切併用)") 15 16 Dim i As Long 17 For i = 22 To 36 18 19 If Not ws.Cells(i, 2) = "" And Not ws.Cells(i, 2).HasFormula Then 20 Dim v 21 v = ws.Range(ws.Cells(i, 15), ws.Cells(i, 45)).Value 22 Exit For 23 End If 24 Next i 25 26 27 Dim x As Long 28 For x = 22 To 123 29 30 If ThisWorkbook.Cells(x, 2) = ws.Cells(i, 2) Then 31 ThisWorkbook.Cells(x, 15).Value = v 32 Exit For 33 End If 34 Next x 35 36 If wb.Worksheets("商品名A").Range("AD28").Value = "有り" Then 37 ThisWorkbook.Cells(x, 37).Value = -500000 38 End If 39 40 wb.Close savechanges:=False 41 file = Dir 42 43 Loop 44 45 Application.ScreenUpdating = True 46 47 MsgBox "コピー完了しました。" 48 49End Sub

投稿2020/06/02 04:31

hatena19

総合スコア33715

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問