dポイントプレゼントキャンペーン実施中!

エクセルマクロで、特定の列が空欄の行のデータだけを引用したい。
今、book1の行1から行10000、列A から列Eにデータ表があります。
E列にはデータが入っていたり、入っていなかったりするのですが、データが空欄の場合に、その行のデータ(AからD)だけを、book2に引用することは可能でしょうか?book2にマクロをつけて、引用できるようにしたいです。(Eにデータがあるかないかは、日によって変わるので、マクロで処理したい)

質問者からの補足コメント

  • ご指摘ありがとうございます。
    book1はxlsxです。
    book1も、book2も、シート名はsheet1です。
    book1は閉じたままで、book2に作ったマクロ(か関数)で引用したいと思っています。
    行範囲は10000で固定です。
    お願いします。

      補足日時:2019/10/29 14:51

A 回答 (6件)

こんばんは!



横からお邪魔します。
>book1は閉じたままで・・・
結構厄介なので、一旦開いて処理するようにしてみました。
尚、Book1のSheet1、A~D列データで重複しているものはない!という前提です。
(万一重複している場合は一つだけが表示されます)

一例です。
Book2の標準モジュールにしてください。

Sub Sample1()
 Dim myDic As Object
 Dim i As Long, j As Long
 Dim myStr As String, buf As String
 Dim wB As Workbook, wS As Worksheet
 Dim myPath As String, fN As String
 Dim myKey, myR, myAry

  Set myDic = CreateObject("Scripting.Dictionary")
  myPath = "保存場所のパス" & "\"
  fN = "Book1.xlsx"
   Workbooks.Open (myPath & fN)
    Set wB = ActiveWorkbook
    Set wS = wB.Worksheets("Sheet1")
     myR = Range(wS.Cells(1, "A"), wS.Cells(10000, "E")) '//←10000行限定★//
      For i = 1 To UBound(myR, 1)
       If myR(i, 5) = "" Then
        For j = 1 To 4
         buf = buf & myR(i, j) & "_"
        Next j
         myStr = Left(buf, Len(buf) - 1)
         If Not myDic.exists(myStr) Then '//←念のため//
          myDic.Add myStr, ""
         End If
       End If
        buf = ""
      Next i
     myKey = myDic.keys
      With ThisWorkbook.Worksheets("Sheet1")
       .Cells.ClearContents
        myR = Range(.Cells(1, "A"), .Cells(UBound(myKey) + 1, "D"))
         For i = 0 To UBound(myKey)
          myAry = Split(myKey(i), "_")
           For j = 0 To UBound(myAry)
            myR(i + 1, j + 1) = myAry(j)
           Next j
         Next i
        Range(.Cells(1, "A"), .Cells(UBound(myKey) + 1, "D")) = myR
      End With
       Set myDic = Nothing
       wB.Close
       MsgBox "完了"
End Sub

※ コード内の「保存場所のパス」の部分はお手元の保存場所フォルダのパスにしてください。

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0

標準モジュールへ登録してください。


Const folder As String = "D:\goo\excel"
はBook1を格納しているフォルダです。あなたの環境にあわせて適切な設定を行ってください。


Public Sub E空列転記()
Const folder As String = "D:\goo\excel"
Dim wb1 As Workbook
Dim sh1 As Worksheet
Dim wrow As Long
Dim rng As Range
ThisWorkbook.Worksheets("Sheet1").Cells.Clear
Set wb1 = Workbooks.Open(folder & "\" & "Book1.xlsx")
Set sh1 = wb1.Worksheets("Sheet1")
Set rng = Nothing
For wrow = 1 To 10000
If sh1.Cells(wrow, "E").Value = "" Then
If rng Is Nothing Then
Set rng = sh1.Range("A" & wrow & ":D" & wrow)
Else
Set rng = Union(rng, sh1.Range("A" & wrow & ":D" & wrow))
End If
End If
Next
If Not (rng Is Nothing) Then
rng.Copy Destination:=ThisWorkbook.Worksheets("Sheet1").Cells(1, 1)
End If
wb1.Close
MsgBox ("完了")
End Sub
    • good
    • 0

こんにちは



不明点は勝手に妄想。
ブックはThisworkbookと同じPathに存在すると仮定

Sub Sample()

Dim wb1, wb2, f1, f2

Const book1 = "book1.xlsx"
Const book2 = "book2.xlsx"

f1 = False
f2 = False

On Error Resume Next
Set wb1 = Workbooks(book1)
If Err.Number = 9 Then
On Error GoTo 0
f1 = True
Set wb1 = Workbooks.Open(ThisWorkbook.Path & "\" & book1)
End If
On Error Resume Next
Set wb2 = Workbooks(book2)
If Err.Number = 9 Then
On Error GoTo 0
f2 = True
Set wb2 = Workbooks.Open(ThisWorkbook.Path & "\" & book2)
End If

On Error GoTo 0

wb1.ActiveSheet.Cells.AutoFilter Field:=5, Criteria1:="<>"
wb1.ActiveSheet.Columns("A:D").Copy Destination:=wb2.ActiveSheet.Cells(1, 1)
wb1.ActiveSheet.Cells.AutoFilter

Application.DisplayAlerts = False
If f1 Then wb1.Close SaveChanges:=False
If f2 Then wb2.Close SaveChanges:=True
Application.DisplayAlerts = True

End Sub
    • good
    • 0

なんとなくですがオートフィルターでE列のフィルター項目の下から2番目にある「(空白セル)」を選択してフィルターを掛け、それをコピー

するだけで済むと思うのですが何か問題が有るのでしょうか?
    • good
    • 0

No1です。

1点、誤記がありましたので訂正します。
5.book1の対象データの行数は10000行固定で良いのでしょうか。それとも変わることがあるのでしょうか。
    • good
    • 0

私が回答するという意思表示ではありませんが、


以下のことが明確になれば、良い回答が得られるかと。
1.book1の拡張子はxlsxですか。
2.book1は既に開いているという前提で良いのですか。それとも、マクロでオープンすることを要求されているのですか。
3.book1の対象データのシート名はなんでしょうか。("Sheet1"でよいのですか)
4.book2の引用先のシート名はなんでしょうか。("Sheet1"でよいのですか)
5.book1の対象データの行数は10000万行固定で良いのでしょうか。それとも変わることがあるのでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!