Excel VBA質問箱 IV

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

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


9753 / 76737 ←次へ | 前へ→

【72542】Re:明細の再確認
発言  UO3  - 12/8/21(火) 20:40 -

引用なし
パスワード
   ▼杏子 さん:

こんばんは

野暮用がが早く片付いたのでコードを書きました。
ややこしくなるので一式、アップします。すべていれかえてください。

なお、

  vntTitleA = Array("型名", "数量", "合価|契約金額|金額", "構成GC")
  vntTitleB = Array("型名", "数量", "契約金額", "構成GC")

これで資料Aと資料Bの、それぞれ対になるタイトルを規定しますが、可能性として複数あるものは
資料Aであれ資料Bであれ、また、どのタイトル項目であれ、"●●|■■|△△|□□" といったように
| で区切って指定します。
また、上記例では、比較列は4組ですが、必要なだけ何組でも記述可能です。

Sub Sample4()
  Dim dicA As Object
  Dim dicB As Object
  Dim dicAonly As Object
  Dim dicBonly As Object
  Dim d As Variant
  Dim colA() As Variant
  Dim colB() As Variant
  Dim shA As Worksheet
  Dim shB As Worksheet
  Dim c As Range
  Dim vntTitleA As Variant
  Dim vntTitleB As Variant
 
  vntTitleA = Array("型名", "数量", "合価|契約金額|金額", "構成GC")
  vntTitleB = Array("型名", "数量", "契約金額", "構成GC")
 
  If UBound(vntTitleA) <> UBound(vntTitleB) Then
    MsgBox "比較タイトル規定に関するプログラムエラーです。" & vbLf & _
        "処理を終了します"
    Exit Sub
  End If
 
  ReDim colA(1 To UBound(vntTitleA) + 1)
  ReDim colB(1 To UBound(vntTitleB) + 1)
 
  Set dicA = CreateObject("Scripting.Dictionary")
  Set dicB = CreateObject("Scripting.Dictionary")
  Set dicAonly = CreateObject("Scripting.Dictionary")
  Set dicBonly = CreateObject("Scripting.Dictionary")

  Set shA = Sheets("Sheet1")
  Set shB = Sheets("Sheet2")

  If Not GetCol(shA, colA, vntTitleA) Then Exit Sub
  If Not GetCol(shB, colB, vntTitleB) Then Exit Sub

  CreateDic shA, dicA, colA
  CreateDic shB, dicB, colB

  OnlyCheck shA, dicA, dicB, dicAonly, colA
  OnlyCheck shB, dicB, dicA, dicBonly, colB

  If dicAonly.Count = 0 Then
    MsgBox "資料(A)にある内容はすべて資料(B)と同じでした"
  Else
    shA.Select
    MsgBox "資料(A)のうち、以下が資料(B)にありません" & vbLf & Join(dicAonly.keys, vbLf)
  End If

  If dicBonly.Count = 0 Then
    MsgBox "資料(B)にある内容はすべて資料(A)と同じでした"
  Else
    shB.Select
    MsgBox "資料(B)のうち、以下が資料(A)にありません" & vbLf & Join(dicBonly.keys, vbLf)
  End If


End Sub

Private Function GetCol(sh As Worksheet, v As Variant, vntT As Variant) As Boolean
  Dim x As Long
  Dim ck As String
  Dim z As Long
  Dim headStr As String
  Dim w As Variant
  Dim wStr As String
  Dim n As Long
  
  
  headStr = vbTab & Join(WorksheetFunction.Index(sh.Range("A1", sh.Cells(1, sh.Columns.Count).End(xlToLeft)).Value, 1, 0), vbTab) & vbTab
  
  With CreateObject("VBScript.RegExp")
    x = UBound(vntT) + 1
    For x = 1 To x
      ck = vntT(x - 1)
      .Pattern = vbTab & "(" & ck & ")" & vbTab
      With .Execute(headStr)
        If .Count = 0 Then
          z = 0
        Else
          n = .Item(0).firstindex + 1
          wStr = Left(headStr, n)
          z = Len(wStr) - Len(Replace(wStr, vbTab, ""))
        End If
      End With
      
      If z = 0 Then
        MsgBox sh.Name & "のタイトル行に" & ck & "がないので処理を終了します"
        Exit Function
      End If
      v(x) = z
      sh.UsedRange.Columns(z).Interior.ColorIndex = xlNone
    Next
  End With
  
  GetCol = True
  
End Function

Private Sub CreateDic(sh As Worksheet, dic As Object, v As Variant)
  Dim c As Range
  Dim sep As String
  Dim d As Variant
  Dim dKey As String
 
  For Each c In sh.Range("A2", sh.Range("A" & sh.Rows.Count).End(xlUp))
    dKey = ""
    sep = ""
    For Each d In v
      dKey = dKey & sep & c.Offset(, d - 1).Value
      sep = "/"
    Next
    dic(dKey) = c.Row
  Next
 
End Sub

Private Sub OnlyCheck(sh As Worksheet, dic1 As Object, dic2 As Object, dicOnly As Object, v As Variant)
  Dim d As Variant
  Dim n As Variant
 
  For Each d In dic1
    If Not dic2.exists(d) Then
      dicOnly(d) = True
      For Each n In v
        sh.Cells(dic1(d), n).Interior.Color = vbRed
      Next
    End If
  Next
End Sub

0 hits

【72509】明細の再確認 杏子 12/8/18(土) 9:20 質問
【72511】Re:明細の再確認 UO3 12/8/18(土) 11:12 発言
【72512】Re:明細の再確認 杏子 12/8/18(土) 15:31 質問
【72515】Re:明細の再確認 UO3 12/8/18(土) 20:54 発言
【72516】Re:明細の再確認 杏子 12/8/19(日) 13:12 発言
【72517】Re:明細の再確認 UO3 12/8/19(日) 14:41 発言
【72518】Re:明細の再確認 杏子 12/8/19(日) 15:02 発言
【72520】Re:明細の再確認 UO3 12/8/19(日) 16:15 発言
【72521】Re:明細の再確認 杏子 12/8/19(日) 16:27 発言
【72523】Re:明細の再確認 UO3 12/8/19(日) 17:25 発言
【72524】Re:明細の再確認 杏子 12/8/19(日) 17:32 発言
【72525】Re:明細の再確認 UO3 12/8/19(日) 17:34 発言
【72527】Re:明細の再確認 杏子 12/8/19(日) 18:58 発言
【72528】Re:明細の再確認 UO3 12/8/19(日) 19:17 発言
【72529】Re:明細の再確認 杏子 12/8/19(日) 19:30 発言
【72533】Re:明細の再確認 杏子 12/8/20(月) 9:32 発言
【72536】Re:明細の再確認 UO3 12/8/20(月) 12:18 発言
【72537】Re:明細の再確認 杏子 12/8/21(火) 6:23 質問
【72538】Re:明細の再確認 杏子 12/8/21(火) 10:37 質問
【72539】Re:明細の再確認 UO3 12/8/21(火) 11:49 発言
【72540】Re:明細の再確認 杏子 12/8/21(火) 12:14 質問
【72541】Re:明細の再確認 UO3 12/8/21(火) 17:48 発言
【72542】Re:明細の再確認 UO3 12/8/21(火) 20:40 発言
【72543】Re:明細の再確認 杏子 12/8/21(火) 21:14 お礼
【72544】Re:明細の再確認 杏子 12/8/21(火) 22:42 質問
【72546】Re:明細の再確認 UO3 12/8/22(水) 0:50 発言
【72548】Re:明細の再確認 杏子 12/8/22(水) 6:26 質問
【72549】Re:明細の再確認 UO3 12/8/22(水) 13:59 発言
【72551】Re:明細の再確認 杏子 12/8/22(水) 15:19 お礼

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