Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows XP Professional : Excel 2010)
VLOOKUPがうまく作動しません。
投稿日時: 18/02/09 12:09:03
投稿者: Ka_Na_1116

大変お世話になります。マクロ初心者です。
 
別のフォルダーにあるデータをVLookupで取得し
なければ保存をしたいのですが
下記のままではすぐに保存するかメッセージBXが出てしまします。
 
入力するブック及びシートはオーダー番号が変更されます。
取得するデータは別フォルダーにあります。
 
***_AA.xlsにある***_BAシートのB8〜B56に
オーダー番号を入力するとE8〜G56に
位置データ.xlsにあるデータシートのA8:D535の中にあるデータを取得
もしデータシートになければ、***_BAシートのB8〜56,E8〜56,F8〜56,G8〜56を
データシートの一番下に貼り付けていく作業がしたいです。
 
***_AA1、AA2と増える可能性があり、増えた場合***_BAもBA1、BA2となる為
Worksheets(2)としました。
以前ご教授いただいたOrderNumber&""
の方法もやってみたり
いろいろと試みましたが、
下名ではどこが間違っているか分かりませんでした。
 
勉強不足で本当に申し訳ございませんが
ご教授の程、よろしくお願いいたします。
 
Sub データ取得()
 
  Application.ScreenUpdating = False
  Dim i As Long
  Dim xlBook
  Set xlBook = Workbooks.Open("C:\Documents and Settings\User\デスクトップ\位置計算書\位置データ.xlsx")
  On Error GoTo ErrorHandler
 With Worksheets(2) 
 For i = 8 To 56  *8から56まで
Next
       
  If Cells(i, 2) <> "" Then *B8〜B56
    
    Cells(i, 5) = WorksheetFunction.VLookup(Cells(i, 2), xlBook.Worksheets("データシート").Range("A8:D535"), 2, False)
    End If
  End With
 
  xlBook.Close
  Application.ScreenUpdating = True
  MsgBox ("完了")
  
 Exit Sub
ErrorHandler:
End Sub

回答
投稿日時: 18/02/09 13:07:30
投稿者: 細雪

Ka_Na_1116 さんの引用:
(抜粋)
  On Error GoTo ErrorHandler
 With Worksheets(2) 
 For i = 8 To 56  *8から56まで
Next
       
  If Cells(i, 2) <> "" Then *B8〜B56
    
    Cells(i, 5) = WorksheetFunction.VLookup(Cells(i, 2), xlBook.Worksheets("データシート").Range("A8:D535"), 2, False)
    End If
  End With

 
まだちゃんと見てないんですが、まず気になったところを一点。
 
On Error GoTo ErrorHandler
     With Worksheets(2) 
        For i = 8 To 56  *8から56まで
            If Cells(i, 2) <> "" Then *B8〜B56
                Cells(i, 5) = WorksheetFunction.VLookup(Cells(i, 2), xlBook.Worksheets("データシート").Range("A8:D535"), 2, False)
            End If
        Next
    End With
 
ですか?
元のコードは For〜Next が全く意味無さそうです。
転記ミスかもしれませんが、一応指摘。

回答
投稿日時: 18/02/09 13:16:18
投稿者: 細雪

書き忘れです。
 

Ka_Na_1116 さんの引用:

(略)
 Exit Sub
ErrorHandler:
End Sub

 
ココもおかしなことになってますね。
ErrorHandler:
    Exit Sub
End Sub
の順にしておかないとエラー処理の意味が無いですよ。
 
 
 
で、元のコードのままだと For〜Next で 変数iが8〜56まで動き終わってから VLookup に渡しますから、
56行目だけが処理されているような気がします。

回答
投稿日時: 18/02/09 14:04:14
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
で、元のコードのままだと For〜Next で 変数iが8〜56まで動き終わってから VLookup に渡しますから、
 56行目だけが処理されているような気がします。

 
変数 i は、57になってからループ終了しますので、
57行目だけが処理
でも、すぐ下の
> If Cells(i, 2) <> "" Then *B8〜B56
の条件に合致せず、End Ifへ・・・
"完了"メッセージを表示して、無事終了・・・めでたしめでたし。
となります。
 
間違っているところを確認するには、下記「注意事項」を参考にトライしてみましょう。
他人に聞く前に、自分でできる最低限のことです。
 
注意事項
 
(1)デバッグ終了するまで、エラートラップはコメントアウトしましょう。
(2)ステップ実行して、流れを確認・・・変数の内容を確認しましょう。
(3)ステップ実行を有効的に使用するには、インデントをキチンとつけたコード記述をしましょう。
(4)Worksheet(2)という記述は、意図しないシートの入替があった場合、エラー若しくは、処理されない
リスクがあります。できるだけ「名前」で指定した方がよいです。

回答
投稿日時: 18/02/09 14:08:47
投稿者: WinArrow
投稿者のウェブサイトに移動

書き忘れ
 
WorkSheet(2)
は、どのブックのシートなのかわかっていますか?
 
>***_AA.xlsにある***_BAシートのB8〜B56に
> オーダー番号を入力すると
と書いてあるから、「***_AA.xls」と思っているかもしれませんが、
確認してみてください。

回答
投稿日時: 18/02/09 14:19:59
投稿者: WinArrow
投稿者のウェブサイトに移動

追加レス
 
Worsheets(2)の件
>***_AA1、AA2と増える可能性があり、増えた場合***_BAもBA1、BA2となる為
>Worksheets(2)としました。
 
背景は、分かりました。
ブックが増えていく(それに伴いシート名が変わる)ということですね?
大丈夫かな?
他人が心配しても仕方がないけれど、
運用ルールをキチンとしておかないと、パニックになる可能性を否定できませんね・・・・
 

回答
投稿日時: 18/02/09 15:58:49
投稿者: WinArrow
投稿者のウェブサイトに移動

このプロシジャ実行する前には、
>「***_AA.xls」ブック
がアクティブで、且つ
>「***_BA」シート
がアクテイブという前提でよいのですね?・・・・その保証も大丈夫ですか?
 
> Dim xlBook
は、
  Dim xlBook As Workbook
とデータ型を付けましょう
 
> Set xlBook = Workbooks.Open("C:\Documents and Settings\User\デスクトップ\位置計算書\位置データ.xlsx")
この時、アクティブなブックは、xlBookになります。
> With Worksheets(2)
では、xlBookの2番目のWorksheetになります。
 
本来ならば、「***_AA.xls」の2番目のWorksheetを指定したいところです。
 
そのためには、先に、本来のブックを記憶しておく必要があります。
ブックの名前が変わるかもしれないことから、運用との絡みで難しいかもしれませんから
そのルールをきちんとした上で、実際の名前で
 
Dim myBook As Workbook
Dim mySheet As worksheet
    Set myBook = WorkBooks("***_AA.xls")
    Set mySheet = myBook.Sheets(2)
をプロシジャの先頭で実行するようにしましょう。
 
そして、参照先ブックを開いたあと、
    With mySheet
        For i = 8 To 56
            If .Cells(i, "B").Value <> "" Then
 
のように、「.」で修飾した形で記述すればよいでしょう。
 
以上は、VBAでプログラムを記述するうえでは、基本的なことです。
 
 
元のコードは、
With 句を使っているのも関わらず、シートで修飾してないから、
シートも、セルも、その時点でアクティブなものを参照することになってしまいます。
 
まずは、基本を理解することから、がんばってみてうださい。
 
 
 
 

回答
投稿日時: 18/02/09 16:38:48
投稿者: 細雪

連投で大変申し訳ないです。
 
前の2件の指摘より先に、

Ka_Na_1116 さんの引用:

  Dim xlBook
  Set xlBook = Workbooks.Open("C:\Documents and Settings\User\デスクトップ\位置計算書\位置データ.xlsx")
(略)

こちらの指摘の方が重要かもしれません。
 
この「ブックを開いた」時点で、フォーカスは「位置データ.xls」に移りますね。
よって、これ以降の対象を省略した書き方、例えば
   With Worksheets(2) 
コレなどは「位置データ.xls」の2番目のシートに対して処理をします。
更に、
  If Cells(i, 2) <> "" Then
この書き方では With にも引っ掛からず、「現在のアクティブシート」と比較しに行きますから、
全くアベコベな処理になっているはずです。
    ※なので私個人的には、初心者のうちは With を使わない方が良いと思っています。
     きっと、正しくは If .Cells(i, 2) <> "" Then ですね。
おそらくこれでは具合がよくないですよね。
 
 
踏まえ、私が書くならどうするのかな・・と考えてみました。
雑で回りくどいですが
' ※必ず対象シートがアクティブな状態で動かすこと。
Dim BASH As Worksheet
Dim xlBook As Workbook, DataSH As Worksheet
Dim myCell As Range, myArea As Range
Dim i As Long

    Set BASH = ActiveWorkbook.Sheets(2)      ' アクティブなブックの2番めのシートを変数に格納
    ' ↓「位置データ」ブックを開き、変数に格納
    Set xlBook = Workbooks.Open("C:\Documents and Settings\User\デスクトップ\位置計算書\位置データ.xlsx")
    ' ↓「データシート」シートを変数に格納
    Set DataSH = xlBook.Worksheets("データシート")
    ' ↓データシートのA列を変数に格納
    Set myArea = DataSH.Range("A")

    For i = 8 To 56    ’処理対象は8〜56行目
    ' ↓「検索」処理。
    ' ↓「myArea」の範囲内から「BASH」シートの各行B列の値を検索し、変数 myCell に格納
    ' ↓ 検索条件は「値」「完全一致」
        Set myCell = myArea.Find(What:=BASH.Cells(i, 2).Value, LookIn:=xlValues, LookAt:=xlWhole)
        If Not myCell Is Nothing Then    ' myCellが空じゃない=何か見つかった場合の処理
            MsgBox WorksheetFunction.VLookup(mysheet.Range("A9"), myArea, 2, False)
            Set myCell = Nothing    ' 変数を初期化して次行へ
        Else    ' myCellが空=見つからなかった場合の処理
            MsgBox "エラー"
        End If
    Next  '以上繰り返し。
    
    xlBook.Close   ' 位置データブックを閉じる

 
中の処理は大人の事情(主に面倒なの)でメッセージボックスにしちゃってます。
手書きなのでミスがあるかもですが、考え方の一例としてどうぞ。
 
 
 
 
と打っていたら・・
WinArrowさん、フォローありがとうございます。
確かに57です(汗)。失礼しました。
 
 
 
折角なので、私もポチり。

回答
投稿日時: 18/02/09 18:21:49
投稿者: WinArrow
投稿者のウェブサイトに移動

このマクロは、どのブックに記述していますか?
 
仮に
>「***_AA.xls」ブック
だとすると
プロシジャの最初に
    Set myBook = Thisworkbook
とすれば、ブック名が変わった(増えた)時にも対応できます。
 
しかし、ブックが増えていくと
同じプログラムが異なるブックに存在することになり、
若し、コードの修正/変更の必要が生じた時、関連するすべてのブックのマクロを修正しなくていけません。
つまり、メンテナンスの効率性が悪いということです。
 
メンテナンス効率まで考えると、データブックとマクロブックを分けて作成し、
マクロブックのマクロでは、関連するすべてのブックを取り扱うようにする必要があります。
 
 
 

回答
投稿日時: 18/02/09 21:04:28
投稿者: WinArrow
投稿者のウェブサイトに移動

ヒントとなるコードをk提示します。
 
エラートラップは、Vlookup関数で不一致時の対応と思いますが、
エラーがあると、オペレータに何のご挨拶も無しに処理が終了してしまいます。
(極めて不親切)
 
↓ヒントのコード、実行できないのでエラーがあるかも・・・
 
Sub データ取得()
Dim i As Long
Dim xlBook As Workbook, myBOOK As Workbook, DataArea As Range
   
    Set myBOOK = ActiveWorkbook
    
    Application.ScreenUpdating = False
    
    Set xlBook = Workbooks.Open("C:\Documents and Settings\User\デスクトップ\位置計算書\位置データ.xlsx")
    Set DataArea = xlBook.Worksheets("データシート").Range("A8:D535")
     
    With myBOOK.Worksheets(2)
        For i = 8 To 56 '*8から56まで
            If .Cells(i, "B") <> "" Then '*B8〜B56
                If WorksheetFunction.CountIf(DataArea.Columns(1), .Cells(i, "B").Value) > 0 Then
                    .Cells(i, "E") = WorksheetFunction.VLookup(.Cells(i, "B").Value, DataArea, 2, False)
                Else
                    If vbNo = MsgBox("データシート不一致あり、KEY = " & .Cells(i, "B").Value & vbLf & _
                                    "処理を続行しますか?", vbYesNo + vbDefaultButton2) Then
                        Exit Sub
                    End If
                End If
            End If
        Next
   End With
   
   xlBook.Close
   Set DataArea = Nothing
   Set xlBook = Nothing
   Set myBOOK = Nothing
    
   Application.ScreenUpdating = True
    
   MsgBox ("完了")
    
   Exit Sub
 
End Sub
 
 

回答
投稿日時: 18/02/10 12:29:53
投稿者: simple

私には最初の文章から意味がとれません。

引用:
***_AA.xlsにある***_BAシートのB8〜B56に
 オーダー番号を入力するとE8〜G56に
位置データ.xlsにあるデータシートのA8:D535の中にあるデータを取得
もしデータシートになければ、***_BAシートのB8〜56,E8〜56,F8〜56,G8〜56を
 データシートの一番下に貼り付けていく作業がしたいです。

ここをもっと正確に記述することから始めるべきだと思います。
雰囲気は何となく伝わる気もしないではないですが、正確さを欠いています。
一行ごとにやるんでしょ?
どことどこを比較するんですか?
こんな曖昧な記述では、コードもあいまいなものになるのは当然です。
もっと論理も目を細かくしないと、今のままでは粗すぎます。

回答
投稿日時: 18/02/10 17:10:50
投稿者: WinArrow
投稿者のウェブサイトに移動

simpleさんから、説明文の表現について、コメントがありましたが、
もう一つ、気になるところ
 

引用:
別のフォルダーにあるデータをVLookupで取得し
 なければ保存をしたいのですが
下記のままではすぐに保存するかメッセージBXが出てしまします。

ここでは、
>すぐに保存する
と説明されていますが、
「保存」とは、上書き保存のこと?
xlBook.Close
は、「ブックを閉じる」であって、
間違っても「上書き保存」ではありません。
 
 
 

回答
投稿日時: 18/02/10 17:16:57
投稿者: WinArrow
投稿者のウェブサイトに移動

私が提示したヒントのコードには
>もしデータシートになければ、***_BAシートのB8〜56,E8〜56,F8〜56,G8〜56を
>データシートの一番下に貼り付けていく作業がしたいです。
の部分は、含まれていません。
 
この処理をかんえるならば、
>データシートのA8:D535の
のセル範囲には、追加したデータは含まれているのでしょうか?
つまり、次回の実行時に検索されない可能性があるということです。

回答
投稿日時: 18/02/11 23:23:19
投稿者: simple

確認のための質問です。
回答願います。
 
(Q1)そのマクロはどのブックに持たせるのですか?
    ブック名の拡張子が xlsになっていますが、
    2010ですよね。xlsmとかじゃないんですか?
 
(Q2) 「B8〜B56にオーダー番号を入力すると」とありますが、
    一行入力したときにということですか?
    それともB8〜B56に入力された全ての行について処理を行うのですか?
 
(Q3) そのとき、E〜G列にはデータの入力がされているんですか?
    データシートのA列とマッチしたときは、データシートから無条件に取り込むんですね。
    E〜G列に上書きするということですか?
    それがデータとして不一致でも有無を言わせず、上書きするんですか?
 
(Q4) マッチしないときは、
   「もしデータシートになければ、***_BAシートのB8〜56,E8〜56,F8〜56,G8〜56を
     データシートの一番下に貼り付けていく作業がしたいです。 」
     とありますが、E〜G列にも入力があるという前提なんですね?
     また、「BAシートのB8〜56,E8〜56,F8〜56,G8〜56」をまとめて貼り付けるんですか?

投稿日時: 18/02/13 13:44:12
投稿者: Ka_Na_1116

皆様
 
返信、大変遅くなり申し訳ございませんでした。
職場のパソコンより質問させていただいておりまして
返信が遅くなりました。
 
いろいろご指摘、ご教授頂き大変感謝しております。
本当にありがとうございます。
 
うまく説明できず、勉強不足で本当に申し訳ございません。
 
少しずつ理解できるよう努力いたします。
 
 
 
 
 
 
 
 
 

投稿日時: 18/02/13 14:05:55
投稿者: Ka_Na_1116

WinArrow 様
 
大変お世話になります。
 

WinArrow さんの引用:
私が提示したヒントのコードには
>もしデータシートになければ、***_BAシートのB8〜56,E8〜56,F8〜56,G8〜56を
>データシートの一番下に貼り付けていく作業がしたいです。
の部分は、含まれていません。
 
この処理をかんえるならば、
>データシートのA8:D535の
のセル範囲には、追加したデータは含まれているのでしょうか?
つまり、次回の実行時に検索されない可能性があるということです。

 
上記ではD535までしか検索できないと言うことですね。
追加したデータも含まれるようにしたいです。
D535を20000にしたらいいでしょうか?
それとも
 Cells(Rows.Count, "A:D").End(xlUp).Row + 1
を追記したらいいでしょうか?
 

回答
投稿日時: 18/02/13 14:16:38
投稿者: WinArrow
投稿者のウェブサイトに移動

Ka_Na_1116 さんの引用:

D535を20000にしたらいいでしょうか?
それとも
 Cells(Rows.Count, "A:D").End(xlUp).Row + 1
を追記したらいいでしょうか?

 
今迄の指定では、駄目だと感じたならば、試してみたらいかがでしょう?
前者の場合、もし、指定行を超えたら同じことになりますよね?
そのくらいは推測できますよね?
つまり、データのあるだけにするか?
無駄なのか?/副作用があるかわかりませんが、列指定にするか?
考えてみてください。
 
後者は論外・・・・試せばわかることです。

投稿日時: 18/02/13 15:55:25
投稿者: Ka_Na_1116

simple 様
 
大変お世話になっております。
 

simple さんの引用:
確認のための質問です。
回答願います。
 
(Q1)そのマクロはどのブックに持たせるのですか?
    ブック名の拡張子が xlsになっていますが、
    2010ですよね。xlsmとかじゃないんですか?
 
(A) このマクロは***_AA.xlsのSheet2の中に持たせます。
   もともとあるブックを使用していますのでxlsのままです。
   xlsmに変更したほうがいいですか?

(Q2) 「B8〜B56にオーダー番号を入力すると」とありますが、
    一行入力したときにということですか?
    それともB8〜B56に入力された全ての行について処理を行うのですか?
 
(A) 行入力したときにだけと考えております。 
 
(Q3) そのとき、E〜G列にはデータの入力がされているんですか?
    データシートのA列とマッチしたときは、データシートから無条件に取り込むんですね。
    E〜G列に上書きするということですか?
    それがデータとして不一致でも有無を言わせず、上書きするんですか?
 
(A)データシートのA列とマッチしたときは、データシートから無条件に取り込むみます。 
   もしデータシートにない場合はE〜Gの列に入力して数値を入力して
   データシートA〜Dの一番下にコピーして上書き保存を考えております。

(Q4) マッチしないときは、
   「もしデータシートになければ、***_BAシートのB8〜56,E8〜56,F8〜56,G8〜56を
     データシートの一番下に貼り付けていく作業がしたいです。 」
     とありますが、E〜G列にも入力があるという前提なんですね?
     また、「BAシートのB8〜56,E8〜56,F8〜56,G8〜56」をまとめて貼り付けるんですか?
 
(A)上記回答と同じになってしまいますが
   まとめて貼り付けを考えています。
 

 
説明不足で本当に申し訳ございません。

投稿日時: 18/02/13 15:59:52
投稿者: Ka_Na_1116

WinArrow 様
 
お世話になります。
 

WinArrow さんの引用:

 
今迄の指定では、駄目だと感じたならば、試してみたらいかがでしょう?
前者の場合、もし、指定行を超えたら同じことになりますよね?
そのくらいは推測できますよね?
つまり、データのあるだけにするか?
無駄なのか?/副作用があるかわかりませんが、列指定にするか?
考えてみてください。
 
後者は論外・・・・試せばわかることです。

 
ご指摘の通りです。
分からないなりにいろいろ試してみます。
勉強いたします。
ありがとうございます。

回答
投稿日時: 18/02/13 17:25:55
投稿者: WinArrow
投稿者のウェブサイトに移動

simpleさんの質問の繰り返しいなりますが、

引用:

(Q4) マッチしないときは、
   「もしデータシートになければ、***_BAシートのB8〜56,E8〜56,F8〜56,G8〜56を
     データシートの一番下に貼り付けていく作業がしたいです。 」
     とありますが、E〜G列にも入力があるという前提なんですね?
     また、「BAシートのB8〜56,E8〜56,F8〜56,G8〜56」をまとめて貼り付けるんですか?
  
(A)上記回答と同じになってしまいますが
   まとめて貼り付けを考えています。

なんか、投げやり的な回答ですね?
>まとめて貼り付け
とは、「マッチしたデータもマッチしないデータも」一緒にして
という意味に聞こえますが?
それでよいのですか?
 
 
 

回答
投稿日時: 18/02/13 21:26:32
投稿者: simple

質問への回答、ありがとうございました。
 

引用:
(A)xlsmに変更したほうがいいですか?
どうでなければならない、ということはありません。
リスクもありますが、ご自由に。
ただそうした使い方は一般的ではないので、
質問の際にその旨コメントするのが常識的でしょうね。
 
引用:
(A) 行入力したときにだけと考えております。 

それでは、
For i = 8 To 56  *8から56まで
Next
とされている理由はなんでしょうか。
 
あえて一行入力した時点で、と書かない理由がわからない。
どっちつかずを続けたいようですね。
 
引用:
(A)上記回答と同じになってしまいますが
   まとめて貼り付けを考えています。
「まとめて」とは一行をまとめてなのか、
「BAシートのB8〜56,E8〜56,F8〜56,G8〜56」をまとめて貼り付ける
のか不明。
一行ごとにやるなら8行目から56行目をまとめて貼り付ける意図が不明。
 
いずれにしても、コードの議論に行き着く前に、
日本語による説明自体が不得要領なので、
私はとりあえずここまでとします。それでは頑張って下さい。

投稿日時: 18/02/16 16:40:08
投稿者: Ka_Na_1116

WinArrow 様 
 
返信遅くなり大変申し訳ございませんでした。
 

WinArrow さんの引用:

なんか、投げやり的な回答ですね?
>まとめて貼り付け
とは、「マッチしたデータもマッチしないデータも」一緒にして
という意味に聞こえますが?
それでよいのですか?

 
 
私は「マッチしなかったデータだけを貼り付けていく」ように考えておりました。
 
私の言葉が足らず、不快な思いをさせてしまい
誠に申し訳ございませんでした。

投稿日時: 18/02/16 16:57:12
投稿者: Ka_Na_1116

simple 様
 
返信が遅くなり大変申し訳ございませんでした。
 

simple さんの引用:
質問への回答、ありがとうございました。
 
引用:
(A)xlsmに変更したほうがいいですか?
どうでなければならない、ということはありません。
リスクもありますが、ご自由に。
ただそうした使い方は一般的ではないので、
質問の際にその旨コメントするのが常識的でしょうね。
 
申し訳ございませんでした。
一般的ではないことすらわかっていませんでした。
今後、質問する際はその旨コメントするようにいたします。
ご指摘頂きありがとうございます。

 
引用:
(A) 行入力したときにだけと考えております。 

それでは、
For i = 8 To 56  *8から56まで
Next
とされている理由はなんでしょうか。
 
あえて一行入力した時点で、と書かない理由がわからない。
どっちつかずを続けたいようですね。
 
8から56までの間で入力した行だけと...と捉えておりました。
 
引用:
(A)上記回答と同じになってしまいますが
   まとめて貼り付けを考えています。
「まとめて」とは一行をまとめてなのか、
「BAシートのB8〜56,E8〜56,F8〜56,G8〜56」をまとめて貼り付ける
のか不明。
一行ごとにやるなら8行目から56行目をまとめて貼り付ける意図が不明。
 
「マッチしなかったデータだけを1行ずつ貼り付けていく」ようにと考えておりました。

いずれにしても、コードの議論に行き着く前に、
日本語による説明自体が不得要領なので、
私はとりあえずここまでとします。それでは頑張って下さい。

 
私の説明が不十分で不快な思いをさせてしまい
誠に申し訳ございませんでした。
色々、ご指摘頂き勉強になります。
ありがとうございました。

回答
投稿日時: 18/02/16 19:56:53
投稿者: 半平太

>***_AA.xlsにある***_BAシートのB8〜B56にオーダー番号を入力するとE8〜G56に
>位置データ.xlsにあるデータシートのA8:D535の中にあるデータを取得

>もしデータシートになければ、***_BAシートのB8〜56,E8〜56,F8〜56,G8〜56を
>データシートの一番下に貼り付けていく作業がしたいです。
 
何度読んでも分からない。
 
何故か? 具体例が無いんですよ。
 
下図を参考に、サンプルを示して頂けませんか?
 

<データシート>       <**_BA>シート
 行 _A_ __B__ __C__ __D__    行 _B_ _C_ _D_ _E_ _F_ _G_
  8   1 BBB1  CCC1  DDD1      8   2         ee2 ff2 gg2
  9   2 BBB2  CCC2  DDD2      9                        
 10   5 BBB5  CCC5  DDD5     10   4         ee4 ff4 gg4
                             11   5         ee5 ff5 gg5

上の例で、何シートがどうなればいいんですか?
 
(上例がそもそもおかしければ、それも修正して)
説明内容と一致するサンプルと希望結果図をアップしてください。

回答
投稿日時: 18/02/16 22:08:14
投稿者: WinArrow
投稿者のウェブサイトに移動

質問者さんは、
回答者の皆さんに千里眼の能力があって、
質問者さんのPCの画面がみえている
と思っているのでは?
ってことないか?・・・単に説明が下手なだけ・・・
 
質問者さんは、見えるような文章で表現しないと、
質問者さんの言いたいことが回答者に伝わらない。
目の前にいる人に話すような表現をしても、伝わらない。
(むずかしいけど、がんばって)
 
 
***_BAシートの8〜56行目のデータで、
データシート(別ブック)の存在しない(***_BAシートのB列セルとデータシートのA列セルを照合)
データをデータシートの現存する行(ex.535行目)の下に複写したい
 
【複写仕様】
***_BAシートのB列セルをデータシートのA列セルへ
***_BAシートのC列セルをデータシートのB列セルへ
***_BAシートのD列セルをデータシートのC列セルへ
***_BAシートのE列セルをデータシートのD列セルへ
ということではないかと推測します。
 
問題は、
(1)なぜ、8〜56なのか?
 常に固定でよいのか?
(2)アンマッチのデータをデータシートに追加する。
  それはそれとして
  1件追加すると、535行までを536行の検索範囲をかえる必要はないのか?
  ということです。
 

トピックに返信