ファイルを共有するので別ファイルのリンクを切る必要があり、vbaで処理ができるようにしたいです
ファイルは2つで②のファイルにvbaを組込ませたいです
①参照先=[masterファイル.xls]の[master1]シート
②書込先=[○○支店.xls]の[xxxx(コード)_yyyy(西暦)]シート
<条件>
1.①の[master1]シートにはA列~X列の5行目から3000行目までデータが入っており
検索値=F列
範囲=F5:X3000
列番号=18(W列)と19(X列) ←2つのデータを取り出したい
2.①のW列とX列は関数が入っているので値だけ取り出したい
3.②のファイルには[xxxx(コード)_yyyy(西暦)]シートがあり、A~AD列の6行目~300行目あたりまでデータが追加されていきます
参照値=Q列
取り出したデータの貼付け先=AB列とAC列
4.①のファイルは一定量のデータが溜ると更新される(書換えられる)ので②のAB列やAC列のすでにデータが入ったセルはそのままで空欄となっているセルだけを埋めるようにしたい
5.ちなみに②は20ファイルくらいあるので、それぞれにvbaを組込ませる予定です(参照ファイルは①の1つだけです)
6.vbaは全くの初心者なので、条件が変わった場合に修正ができるように詳しい解説をお願いしたいです
どうぞよろしくお願いいたします
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
テスト用のコードを作成しました。
2種類あります。マクロ「SheetSet」は空のブックに模擬データを作ります。新規ブックに対して行ってください。
実際の業務用ブックでは、複雑な条件(関数や他ブックの参照など)があるため、要素を単純化した模擬データで問題解決していった方がいいような気がします。
処理
①Q5:Q3000にランダムな文字列「土・日・月」のいずれかを入力。
検索に使います。
②W5:W3000に=row()*10
③X5:X3000に =row()*100
この関数式の【値】を取り出すテストを行います。
④AB5:AB3000には、5行ごとに"データ”という文字列を入力します。
⑤AC5:AC3000には、3行ごとに"データ”という文字列を入力します。
次にマクロ「Test」を使って、動作確認をします。
やることは
5行目から3000行目まで
【Q列の値が(土)の行 & AB列の値が空白】→【W列の関数式の(値)をAB列に転記】
【Q列の値が(土)の行 & AC列の値が空白】→【X列の関数式の(値)をAX列に転記】
Q列の値が(土)の行のAB:AC列に、W:X列の関数式の(値)を転記するわけです。
ただし、AB5:AB3000には、5行ごとに"データ” AC5:AC3000には、3行ごとに"データ”があります。
この文字列は消えません。
かなり単純な内容ですが、この模擬ブックとコードを元に、少しずつ改良していけたらと思います。
-----------------------------------------------------------------------
Sub SheetSet()
Dim i As Long
Cells.Clear
For i = 5 To 3000
Cells(i, "Q") = Int(Rnd() * 3)
Cells(i, "W").Formula = "=row()*10"
Cells(i, "X").Formula = "=row()*100"
If i Mod 5 = 1 Then
Cells(i, "AB") = "データ"
End If
If i Mod 3 = 1 Then
Cells(i, "AC") = "データ"
End If
Next
Columns(17).AutoFit
Range("Q:Q").NumberFormatLocal = "AAA"
Range("W:X").EntireColumn.AutoFit
Range("A:P").EntireColumn.ColumnWidth = 0.1
Range("R:V").EntireColumn.ColumnWidth = 0.1
Range("Y:AA").EntireColumn.ColumnWidth = 0.1
For i = 5 To 3000
If Cells(i, "Q") = 0 Then
Cells(i, "Q").Interior.Color = vbCyan
End If
Next
End Sub
-----------------------------------------------------------------------
-----------------------------------------------------------------------
Sub Test()
Dim i
Dim fRange1 As Range
Dim fRange2 As Range
Set fRange1 = Cells.Find("土", LookIn:=xlValues)
If fRange1 Is Nothing Then
MsgBox ""
Exit Sub
Else
Set fRange2 = fRange1
If Cells(fRange2.Row, "AB") = "" Then
Cells(fRange2.Row, "AB").Value = Cells(fRange2.Row, "W")
End If
End If
If Cells(fRange2.Row, "AC") = "" Then
Cells(fRange2.Row, "AC").Value = Cells(fRange2.Row, "X")
End If
Do
Set fRange2 = Cells.FindNext(fRange2)
If fRange1.Address = fRange2.Address Then
Exit Do
Else
If Cells(fRange2.Row, "AB") = "" Then
Cells(fRange2.Row, "AB") = Cells(fRange2.Row, "W")
End If
If Cells(fRange2.Row, "AC") = "" Then
Cells(fRange2.Row, "AC") = Cells(fRange2.Row, "X")
End If
End If
Loop
End Sub
-----------------------------------------------------------------------
No.4
- 回答日時:
一例です。
For i = 6 To 300
If .Columns("F:F").Find(Range("Q" & i).Value, LookAt:=xlWhole) Is Nothing Then
Range("AB" & i).Value="該当なし"
Else
Range("AB" & i).Value = .Columns("F:F").Find(Range("Q" & i).Value, LookAt:=xlWhole).Offset(0, 17).Value
・・・・
End IF
最終行が300と限らない場合は
For i = 6 To Rnage("Q" & Rows.Count).End(xlup).Row
Rows.Countは、そのシートに持っている行数です。
Excel2007以上のバージョンでは 約100万行
End(xlup).
Q列の一番下から上へ移動して空白で亡くなる
Row
その行番号です。
出来ました!
ありがとうございます
これをベースにカスタマイズしていきます
何度も相談に乗っていただき本当にありがとうございました
No.3
- 回答日時:
ん~、たぶんですが、検索の値が見つからないのでは
エラーが出て、黄色で表示されている状態で
Range("AB" & i).Value = .Columns("F:F").Find(Range("Q" & i).Value, LookAt:=xlWhole).Offset(0, 17).Value
↑
矢印の部分にマウスを移動させると、その時の値が表示されます。
確認してみてください。
For i = 6 To 300
Msgbox Range("Q" & i).Value
If .Columns("F:F").Find(Range("Q" & i).Value, LookAt:=xlWhole) Is Nothing Then MsgBox "なし"
Range("AB" & i).Value = .Columns("F:F").Find(Range("Q" & i).Value, LookAt:=xlWhole).Offset(0, 17).Value
とかにして、確認してみてください。
見つからないときのエラー処理を加える事になります。
No.2
- 回答日時:
分かりやすい所からですが
①と②のファイルが同じフォルダーある。
②のファイルの[xxxx(コード)_yyyy(西暦)]シートが開いている状態
Sub ボタン1_Click()
Workbooks.Open Filename:=ThisWorkbook.Path & "\master.xlsx"
ThisWorkbook.Activate
With Workbooks("master").Sheets("master1")
For i = 6 To 300
Range("AB" & i).Value = .Columns("F:F").Find(Range("Q" & i).Value, LookAt:=xlWhole).Offset(0, 17).Value
Next
End With
Workbooks("master").Close SaveChanges:=False
End Sub
を実行してみてください。
①ファイルのF列を検索して、同じものがみつかったら、右へ17列移動した値をAB列に入れる
と云う事です。
エラー処理も何もしていませんので、たたき台として理解してみてください。
ありがとうございます
早速やってみましたが、
Range(”AB”&i).value〜で
『オブジェクト変数またはWithブロック変数が設定されていません』
というエラーが出てしまいます
どのように追記すべきがご教授いただければと思います
またファイル名などは実際に合わせて変更しております
→Thisworkbooks(”master160.xls”)など
どうぞよろしくお願いします
No.1
- 回答日時:
ちょうど暇なので、お付き合いします。
(ご覧になっておられれば)確認
1 元データのファイル(約3000行)
F ・・・・ W X
検索値 内容1 内容2
2 抽出先データのファイル(約300行)
Q ・・・・ AB AC
参照値 内容1 内容2
Vlookup関数ではダメだったのでしょうか?
AB列に
=Vlookup(Q6,元データのファイル!F:X,18,False) 下へコピーしておいておく
ではダメなのですか?
回答ありがとうございます
リンクを切る必要があるのでマクロにしたいんです…
現在は、編集の度にvlookup関数を入れてリンク切りの作業を続けています
条件が多いので難しいでしょうか…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) Excelで、別シートの表のステータスに伴った動的な自動転記をしたいです。 2 2023/06/14 15:56
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Excel(エクセル) VBA セルの値と同じ名前のシートにデータを貼り付けするやり方を教えてください 2 2022/05/17 16:26
- Excel(エクセル) Excelの関数でこんな処理ができますか 1 2023/02/08 13:46
- Excel(エクセル) マクロか関数で処理したいのですが、教えて頂けませんか。 8 2022/10/31 15:18
- Visual Basic(VBA) 【VBA】データを入力後に,同一シート内に履歴として転記するVBAコードを教えていただきたいです。 3 2022/11/16 01:37
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
Cellsのかっこの中はどっちが行...
-
vba 2つの条件が一致したら...
-
マクロ 最終列をコピーして最終...
-
データグリッドビューの一番最...
-
B列の最終行までA列をオート...
-
セルに値が入っていた時の処理
-
IIF関数の使い方
-
VBAでのリスト不一致抽出について
-
C# dataGridViewの値だけクリア
-
VBAを使って検索したセルをコピ...
-
【VBA】2つのシートの値を比較...
-
【Excel VBA】カンマと改行コー...
-
VBAのFind関数で結合セルを検索...
-
VBAでエラーインジケーターにつ...
-
VBマクロ 色の付いたセルを...
-
VBAで、特定の文字より後を削除...
-
文字列の結合を空白行まで実行
-
エクセルVBAで複数の条件を満た...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
VBAを使って検索したセルをコピ...
-
文字列の結合を空白行まで実行
-
VBA指定行削除
-
VBAのFind関数で結合セルを検索...
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
マクロ 最終列をコピーして最終...
-
エクセルについて
-
【VBA】2つのシートの値を比較...
-
URLのリンク切れをマクロを使っ...
-
データグリッドビューの一番最...
-
Changeイベントでの複数セルの...
-
空白セルをとばして転記
-
rowsとcolsの意味
-
エクセルVBAにて =A1=B1とすれ...
おすすめ情報
ありがとうございます
ご指示いただきました通り実行したところ、①の参照先データに情報がないためのエラーのようです
”xxxx-xxxx-xx”←検索値(数字の羅列)
”なし”
のメッセージが上がりました
参照先も更新されるため最新のデータに対応しない状況です
この場合、何もしないで次の検索に入る事は出来ますでしょうか?
何度もお手数おかけして申し訳ないです
どうぞよろしくお願い致します
追記です
試しに
For i = 289 To 300
へ変更(289行目以降には参照値が入っていない状態)したところ
以降300行目までメッセージがOKと表示される状態でした
参照値が空白のケースもあり得ます…
全くわかっていなくてすいません