Excel VBA質問箱 IV

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

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


32259 / 76734 ←次へ | 前へ→

【49714】Re:2表出力
回答  Hirofumi  - 07/6/18(月) 12:16 -

引用なし
パスワード
   修正で間違えるといけないので、変更のない「Private Sub DoFilter」以外をUpします
尚、コメントは、Up出来る行数を超えるといけないので削除して有ります

Public Sub Main2()
  
  '◆Listのデータ列数(A列〜AG列)
  Const clngColumns As Long = 33
  '◆「日付」の列位置を指定(基準セル位置からの列Offset:基準がA1で「日付」がA列なら0)
  Const clngDate As Long = 0
  '◆「店舗」の列位置を指定(基準セル位置からの列Offset:基準がA1で「店舗」がB列なら1)
  Const clngKey As Long = 1
  '◆「項目」の列位置を指定(基準セル位置からの列Offset:基準がA1で「項目」がC列なら2)
  Const clngItem As Long = 2
  
  Dim lngRows As Long
  Dim rngList As Range
  Dim rngResult As Range
  Dim rngWork As Range
  Dim vntKeyA1 As Variant
  Dim vntKeyA2 As Variant
  Dim vntKeyB1 As Variant
  Dim rngOther As Range
  Dim vntItem As Variant
  Dim vntCPos As Variant
  Dim vntRPos As Variant
  Dim strProm As String

  '◆Listの先頭セル位置を基準とする(列見出し「日付」のセル位置)
  Set rngList = Worksheets("List").Cells(1, "A")

  '◆List2の先頭セル位置を基準とする(列見出し「店舗」のセル位置)
  Set rngResult = Worksheets("List2").Cells(5, "B")
  
  Application.ScreenUpdating = False
  
  With rngList
    lngRows = .CurrentRegion.Rows.Count - 1
    If lngRows <= 0 Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
  End With
  
  With rngResult
    vntKeyA1 = .Parent.Cells(2, 2).Value
    vntKeyA2 = .Parent.Cells(2, 3).Value
    vntKeyB1 = .Parent.Cells(3, 2).Value
    .CurrentRegion.ClearContents
  End With
  strProm = "抽出日付が、日付と認められません"
  If Not IsDate(Left(vntKeyA1, 4) _
      & "/" & Mid(vntKeyA1, 5, 2) _
          & "/" & Right(vntKeyA1, 2)) Then
    GoTo Wayout
  End If
  If Not IsDate(Left(vntKeyA2, 4) _
      & "/" & Mid(vntKeyA2, 5, 2) _
          & "/" & Right(vntKeyA2, 2)) Then
    GoTo Wayout
  End If
  
  '◆「項目」列の抽出条件文字列を設定
  vntItem = Array("売上", "差益", "仕入", "在庫")
  
  '◆累計を転記する別シートの位置
  vntCPos = Array(2, 5, 9, 12)
  
  '◆部門データの転記行位置を設定
  Select Case vntKeyB1
    Case "本店"
      Set rngOther = Worksheets("部門").Cells(4, "C")
      vntRPos = Array(56, 59, 62, 77, 65, 89, 68, 71, 34, "", _
              1, 37, "", 16, 19, 4, 22, 25, 40, 43, _
              86, 46, 7, 10, 28, "", "", 80, "", 92)
    Case "支店A"
      Set rngOther = Worksheets("部門").Cells(118, "C")
      vntRPos = Array(56, 59, "", "", 68, "", 62, 31, 34, "", _
              13, 1, "", "", "", "", 16, 19, 47, 4, _
              "", 50, 37, 7, "", "", "", 22, "", 25)
    Case "支店B"
      Set rngOther = Worksheets("部門").Cells(208, "C")
      vntRPos = Array("", "", "", "", "", "", "", "", "", 4, _
              "", "", 1, "", "", "", "", "", "", "", _
              "", "", "", "", "", "", 7, "", 13, "")
  End Select
  
  With Worksheets
    Set rngWork = .Add(After:=.Item(.Count)).Cells(1, "A")
  End With
  With rngWork
    rngList.Resize(, clngColumns).Copy Destination:=.Item(1)
    'AdvancedFilter条件範囲の列見出しの出力
    With .Offset(, clngColumns)
      .Offset(, 1).Resize(, 2).Value _
          = rngList.Offset(, clngDate).Value
      .Offset(, 3).Value = rngList.Offset(, clngKey).Value
      .Offset(, 4).Value = rngList.Offset(, clngItem).Value
    End With
  End With
  
  strProm = "抽出条件に一致するレコードが有りません"
  If Not AddUp(rngList, rngResult, rngWork, vntKeyA1, _
          vntKeyB1, clngColumns, clngItem, vntItem, _
            rngOther, vntCPos, vntRPos) Then
    GoTo Wayout
  End If
  If Not AddUp(rngList, rngResult.Offset(, 10), rngWork, vntKeyA2, _
          vntKeyB1, clngColumns, clngItem, vntItem, _
            rngOther.Offset(1), vntCPos, vntRPos) Then
    GoTo Wayout
  End If

  strProm = "処理が完了しました"
  
Wayout:

  If Not rngWork Is Nothing Then
    Application.DisplayAlerts = False
    rngWork.Parent.Delete
    Application.DisplayAlerts = True
  End If
  
  Application.ScreenUpdating = True
  
  Set rngWork = Nothing
  Set rngList = Nothing
  Set rngResult = Nothing
  Set rngOther = Nothing
  
  MsgBox strProm, vbInformation
     
End Sub

Private Function AddUp(rngList As Range, rngResult As Range, _
            rngWork As Range, vntKeyA1 As Variant, _
            vntKeyB1 As Variant, lngColumns As Long, _
            lngItem As Long, _
            vntItem As Variant, _
            Optional rngOther As Range, _
            Optional vntCPos As Variant, _
            Optional vntRPos As Variant) As Boolean

  '◆「1係」の列位置を指定(基準セル位置からの列Offset:基準がA1で「1係」がD列なら3)
  Const clngBegin As Long = 3
  
  Dim i As Long
  Dim j As Long
  Dim lngRows As Long
  Dim vntResult As Variant
  Dim vntTop As Variant
  
  vntTop = Left(vntKeyA1, 4) & "/" & Mid(vntKeyA1, 5, 2) _
          & "/" & Right(vntKeyA1, 2)
  vntTop = DateValue(vntTop)
  vntTop = ">=" & Format(DateSerial(Year(vntTop), _
            Month(vntTop), 1), "yyyymmdd")
  AddUp = True
  With rngWork
    ReDim vntResult(UBound(vntItem))
    .Offset(1, lngColumns + 1).Value = vntTop
    .Offset(1, lngColumns + 2).Value = "<=" & vntKeyA1
    .Offset(1, lngColumns + 3).Resize(UBound(vntItem) + 1).Value _
        = "=" & """=" & vntKeyB1 & """"
    For i = 0 To UBound(vntItem)
      .Offset(1, lngColumns + 4).Value _
          = "=" & """=" & vntItem(i) & """"
      DoFilter rngList.CurrentRegion, .Offset(, lngColumns + 1) _
                  .Resize(2, 4), .Resize(, lngColumns)
      lngRows = .CurrentRegion.Rows.Count
      With .Offset(lngRows, clngBegin).Resize(, lngColumns - clngBegin)
        .FormulaR1C1 = "=Sum(R[-" & (lngRows - 1) & "]C:R[-1]C)"
      End With
      vntResult(i) = .Offset(lngRows).Resize(, lngColumns).Value
      vntResult(i)(1, lngItem + 1) = vntItem(i) & "累計"
    Next i
    .Offset(1, lngColumns + 2).Resize( _
          UBound(vntItem) + 1).Value = vntKeyA1
    For i = 0 To UBound(vntItem)
      .Offset(1 + i, lngColumns + 4).Value _
          = "=" & """=" & vntItem(i) & """"
    Next i
    DoFilter rngList.CurrentRegion, .Offset(, lngColumns + 2) _
        .Resize(UBound(vntItem) + 1 + 1, 3), .Resize(, lngColumns)
    lngRows = .CurrentRegion.Rows.Count
    If lngRows = 1 Then
      AddUp = False
      rngResult.Parent.Activate
      Exit Function
    End If
    vntTop = .Offset(1, lngItem).Resize(lngRows).Value
    For i = 1 To lngRows - 1
      For j = 0 To UBound(vntItem)
        If vntTop(i, 1) = vntItem(j) Then
          vntTop(i, 1) = j
          Exit For
        End If
      Next j
    Next i
    .Offset(1, lngColumns).Resize(lngRows - 1).Value = vntKeyB1
    .Offset(1).Resize(lngRows - 1, lngColumns + 1).Sort _
        Key1:=.Offset(1, lngColumns), Order1:=xlAscending, _
        Header:=xlNo, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom, _
        SortMethod:=xlStroke
    .Offset(1, lngColumns).EntireColumn.ClearContents
    For i = 0 To UBound(vntItem)
      .Offset(lngRows + i).Resize(, _
          lngColumns).Value = vntResult(i)
    Next i
    Application.Intersect(.CurrentRegion, _
        .CurrentRegion.Offset(, 1)).Copy
  End With
  
  With rngResult
    .PasteSpecial Paste:=xlPasteValues, _
        Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=True
    Application.CutCopyMode = False
    If (Not rngOther Is Nothing) _
        And VarType(vntRPos) = vbArray + vbVariant Then
      For i = UBound(vntCPos) To 0 Step -1
        If vntCPos(i) <> "" Then
          For j = 0 To UBound(vntRPos)
            If vntRPos(j) <> "" Then
              rngOther.Offset(vntRPos(j), vntCPos(i)).Value _
                  = .Offset(j + 2, lngRows + i).Value
            End If
          Next j
        End If
      Next i
    End If
    .Parent.Activate
    .Select
  End With
     
End Function

5 hits

【49539】月間集計 hiro 07/6/9(土) 17:35 質問
【49541】Re:月間集計 Hirofumi 07/6/10(日) 0:39 回答
【49543】コード修正して下さい Hirofumi 07/6/10(日) 8:17 回答
【49545】Re:コード修正して下さい Hirofumi 07/6/10(日) 13:20 回答
【49552】Re:コード修正して下さい hiro 07/6/10(日) 21:32 質問
【49554】Re:コード修正して下さい Hirofumi 07/6/10(日) 23:43 回答
【49555】Re:コード修正して下さい hiro 07/6/11(月) 0:52 発言
【49556】Re:コード修正して下さい Hirofumi 07/6/11(月) 1:24 回答
【49557】2表出力 Hirofumi 07/6/11(月) 2:49 回答
【49558】Re:2表出力 Hirofumi 07/6/11(月) 2:51 回答
【49581】Re:2表出力 hiro 07/6/11(月) 23:32 質問
【49601】Re:2表出力 Hirofumi 07/6/12(火) 14:49 回答
【49653】Re:2表出力 hiro 07/6/14(木) 19:10 発言
【49654】Re:2表出力 Hirofumi 07/6/14(木) 20:57 回答
【49667】Re:2表出力 hiro 07/6/15(金) 1:29 発言
【49680】Re:2表出力 Hirofumi 07/6/15(金) 19:57 回答
【49704】Re:2表出力 hiro 07/6/17(日) 23:27 発言
【49713】Re:2表出力 Hirofumi 07/6/18(月) 12:13 回答
【49714】Re:2表出力 Hirofumi 07/6/18(月) 12:16 回答

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