Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6503 / 13646 ツリー ←次へ | 前へ→

【44761】複数のシートを利用して・・・ 北風小僧 06/11/30(木) 20:00 質問[未読]
【44762】Re:複数のシートを利用して・・・ Statis 06/11/30(木) 20:37 回答[未読]
【44765】Re:複数のシートを利用して・・・ 北風小僧 06/11/30(木) 21:18 お礼[未読]
【44847】Re:複数のシートを利用して・・・ 北風小僧 06/12/3(日) 16:51 質問[未読]
【44852】Re:複数のシートを利用して・・・ Hirofumi 06/12/3(日) 19:45 回答[未読]
【44854】Re:複数のシートを利用して・・・ Kein 06/12/3(日) 23:42 回答[未読]

【44761】複数のシートを利用して・・・
質問  北風小僧  - 06/11/30(木) 20:00 -

引用なし
パスワード
    こんばんは。よろしくお願いします。

<シート1>     <シート2>
番号  点数    番号  氏名
--------------   ---------------------
 1   25     1   佐藤
 5   74     2   田中
 3   95     3   佐々木
 2   45     4   村野
 1   11     5   秋葉
 3   65     6   結城

 上の2つのシートを番号で連結して、Excelファイルで

番号   氏名    点数
----------------------------
 1   佐藤     25
 5   秋葉     74
 3   佐々木    95
 2   田中     45
 1   佐藤     11
 3   佐々木    65

と出力したいのです。
 どなたか教えてください。

【44762】Re:複数のシートを利用して・・・
回答  Statis  - 06/11/30(木) 20:37 -

引用なし
パスワード
   こんばんは
Sheet3に表示させます

Sub Test()
Dim Da As Variant, i As Long, Ma As Variant
With Worksheets("Sheet1")
   Da = .Range("A1", .Range("A65536").End(xlUp)).Resize(, 3).Value
End With
With Worksheets("Sheet2")
   For i = 1 To UBound(Da)
     Ma = Application.Match(Da(i, 1), .Columns(1), 0)
     If Not IsError(Ma) Then
      Da(i, 3) = Da(i, 2)
      Da(i, 2) = .Cells(Ma, 2).Value
     Else
      Da(i, 2) = ""
     End If
   Next i
End With
Worksheets("Sheet3").Range("A1").Resize(UBound(Da), 3).Value = Da
  
End Sub

【44765】Re:複数のシートを利用して・・・
お礼  北風小僧  - 06/11/30(木) 21:18 -

引用なし
パスワード
    うまくできました。ありがとうございました。

【44847】Re:複数のシートを利用して・・・
質問  北風小僧  - 06/12/3(日) 16:51 -

引用なし
パスワード
    先日質問しましたものの追加となってしまいますが、以下のような場合はどうなりますか?

<シート1>          <シート2>         <シート3>
番号 点数 Col 月    番号  氏名       Col  色
--------------------   ---------------------  ------------------
 1  25  3  7月     1   佐藤        1  赤
 5  74  2  2月      2   田中        2  青
 3  95  1  1月      3   佐々木       3  黄
 2  45  2  2月     4   村野
 1  11  3  3月      5   秋葉
 3  65  1  4月      6   結城

 上の3つのシートを[番号]、[Col]で連結して、Excelファイルで

番号   氏名    点数  Col  色  月
-----------------------------------------------------
 1   佐藤     25   3   黄 7月
 5   秋葉     74   2   青 2月
 3   佐々木    95   1   赤 1月
 2   田中     45   2   青 2月
 1   佐藤     11   3   黄 3月
 3   佐々木    65   1   赤 4月

と出力したいのです。
 どなたか教えてください。

【44852】Re:複数のシートを利用して・・・
回答  Hirofumi  - 06/12/3(日) 19:45 -

引用なし
パスワード
   Option Explicit

Public Sub Sample()

  Dim i As Long
  Dim lngRows As Long
  Dim rngList As Range
  Dim rngName As Range
  Dim vntName As Variant
  Dim rngColor As Range
  Dim vntColor As Variant
  Dim rngResult As Range
  Dim lngFound As Long
  Dim strProm As String
  
  'Sheet1Listの左上隅セル位置を基準として設定(列見出し「番号」のセル位置)
  Set rngList = Worksheets("Sheet1").Cells(1, "A")
  
  'Sheet2Listの左上隅セル位置を基準として設定(列見出し「番号」のセル位置)
  Set rngName = Worksheets("Sheet2").Cells(1, "A")
  
  'Sheet1Listの左上隅セル位置を基準として設定(列見出し「Col」のセル位置)
  Set rngColor = Worksheets("Sheet3").Cells(1, "A")
  
  With rngName
    'データ行数を取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
    'データが無い場合
    If lngRows <= 0 Then
      strProm = .Parent.Name & "のデータが有りません"
      GoTo Wayout
    End If
    'Sheet2の「番号」列範囲を取得
    Set rngName = .Offset(1).Resize(lngRows)
  End With

  With rngColor
    'データ行数を取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
    'データが無い場合
    If lngRows <= 0 Then
      strProm = .Parent.Name & "のデータが有りません"
      GoTo Wayout
    End If
    'Sheet3の「Col」列範囲を取得
    Set rngColor = .Offset(1).Resize(lngRows)
  End With

  With rngList
    'データ行数を取得
    lngRows = .Offset(Rows.Count - .Row).End(xlUp).Row - .Row
    'データが無い場合
    If lngRows <= 0 Then
      strProm = .Parent.Name & "のデータが有りません"
      GoTo Wayout
    End If
    '「番号」データを配列に取得
    vntName = .Resize(lngRows + 1).Value
    '「Col」データを配列に取得
    vntColor = .Offset(, 2).Resize(lngRows + 1).Value
  End With
  
  '新規Bookを追加し先頭シートを結果シートとする
  Set rngResult = Workbooks.Add.Worksheets(1).Cells(1, "A")
  'Sheet1のデータ結果シートにCopy
  rngList.Resize(lngRows + 1, 4).Copy Destination:=rngResult
  '結果シートに列を挿入
  With rngResult
    .Offset(, 3).EntireColumn.Insert
    .Offset(, 1).EntireColumn.Insert
  End With
  
  '列見出しを代入
  vntName(1, 1) = rngName(1).Offset(-1, 1).Value
  '列見出しを代入
  vntColor(1, 1) = rngColor(1).Offset(-1, 1).Value
  '探索
  For i = 2 To lngRows + 1
    '氏名を探索
    lngFound = RowSearch(vntName(i, 1), rngName)
    If lngFound > 0 Then
      vntName(i, 1) = rngName(lngFound, 2).Value
    End If
    'Colを探索
    lngFound = RowSearch(vntColor(i, 1), rngColor)
    If lngFound > 0 Then
      vntColor(i, 1) = rngColor(lngFound, 2).Value
    End If
  Next i
    
  '画面更新を停止
  Application.ScreenUpdating = False
  
  With rngResult
    '氏名を出力
    .Offset(, 1).Resize(lngRows + 1).Value = vntName
    'Colを出力
    .Offset(, 4).Resize(lngRows + 1).Value = vntColor
  End With
  
  strProm = "処理が完了しました"
  
Wayout:
  
  '画面更新を再開
  Application.ScreenUpdating = True
  
  Set rngList = Nothing
  Set rngName = Nothing
  Set rngColor = Nothing
  Set rngResult = Nothing
  
  MsgBox strProm, vbInformation
  
End Sub

Private Function RowSearch(vntKey As Variant, _
            rngScope As Range, _
            Optional lngOver As Long, _
            Optional lngMode As Long = 1) As Long

  Dim vntFind As Variant
  
  If rngScope Is Nothing Then
    lngOver = 1
    Exit Function
  End If
  
  'Matchによる二分探索
  vntFind = Application.Match(vntKey, rngScope, lngMode)
  'もし、エラーで無いなら
  If Not IsError(vntFind) Then
    'もし、Key値と探索位置の値が等しいなら
    If vntKey = rngScope(vntFind).Value Then
      '戻り値として、行位置を代入
      RowSearch = vntFind
    End If
    'Key値を超える最小値のある行
    lngOver = vntFind + 1
  Else
    lngOver = 1
  End If
  
End Function

【44854】Re:複数のシートを利用して・・・
回答  Kein  - 06/12/3(日) 23:42 -

引用なし
パスワード
   ブックの先頭にシートを追加し、そこへ検索結果を表示するとして・・

Sub Result_MyData_Search()
  Dim MyR As Range

  With Worksheets("Sheet1")
   Set MyR = .Range("A2", .Range("A65536").End(xlUp))
  End With
  Application.ScreenUpdating = False
  With Worksheets.Add(Before:=Worksheets(1))
   .Range("A1:F1").Value = _
   Array("番号", "氏名", "点数", "Col", "色", "月")
   MyR.Copy .Range("A2")
   MyR.Offset(, 1).Resize(, 2).Copy .Range("C2") 
   MyR.Offset(, 3).Copy .Range("F2")
   With .Range("A2", .Range("A65536").End(xlUp))
     .Offset(, 1).Formula = _
     "=VLOOKUP($A2,Sheet2!$A:$B,2,FALSE)"
     .Offset(, 4).Formula = _
     "=VLOOKUP($D2,Sheet3!$A:$B,2,FALSE)"
   End With
   With .Range("A1")
     .CurrentRegion.Copy
     .PasteSpecial xlPasteValues
     .Select
   End With
  End With
  With Application
   .CutCopyMode = False
   .ScreenUpdating = True
  End With
  Set MyR = Nothing
End Sub

シート名は Sheet1,Sheet2,Sheet3 という事と、各シートの1行目が項目
という事が前提です。 

6503 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free