[[20150711095654]] 『データを横から縦にした時の転記』(くろ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『データを横から縦にした時の転記』(くろ)

以前ご教授いただいたものを変更したいのでよろしくお願いします。
借方/適用/金額を横に入力していたものを縦に変更しました。
転記先の振伝は変更なしです。

現在自分で変更したのは一回こっきりと標準モジュール1だけです。

標準モジュール1のmake振伝でループが止めたかたが分からず困ってます。
一覧表のA列をダブルクリックするとA列の数字が同じものだけ転記
一覧表のB列をダブルクリックするとB列の日付が同じものだけ転記

【旧一覧表】

   A____B____C____D____E ____F  ・・・ IS_____IT_____IU_____IV_____IW_____IX_____IY_____IZ_____JA_____JB_____JC  
 1 NO 日付 名前 借方1 適用1 金額1 ・・・借方84 適用84 金額84  空白  空白  空白  貸方1 合計1 貸方2 合計2  振伝順番

(新一覧表)

   A_____B_____C_____D_____E _____F_____G______H______I______J_____K_______L
 1 No  日付 名前 借方 適用 金額 貸方1 合計1 貸方2 合計2 振伝順番 事務所

【振伝】
1行目〜14行目までが1ブロック

 1(M2)                 伝票No  
 2(B4〜K4の10セル)           日付 
 3(B6〜I6の8セル)〜(B12〜I12の8セル) 金額
 4(K6)           〜(K12)       借方
 5(L6〜M6の2セル)〜(L12〜M12の2セル) 適用 
 6(N6〜R6の5セル)           貸方
 7(S6〜Z6の8セル)           合計
 8(N7〜R7の5セル)           貸方
 9(S7〜Z7の8セル)           合計
 10(N13〜R13の5セル)          名前 
※()が1セル(結合)

【旧標準モジュール 1】
Option Explicit

 Function SumDebit(r As Range, Optional intvl = 3) As Variant
    Dim i As Long
    For i = 1 To r.Cells.Count Step intvl
        SumDebit = SumDebit + Val(r.Cells(i).Value)
    Next
 End Function

 Sub make振伝(st As Long, cnt As Long)
    Dim pos As Range
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim oldP As String
    Dim newP As String
    Dim i As Long
    Dim j As Long
    Dim num As Long
    Dim copyFrom As Range
    Dim setcnt As Long
    Dim crItem1 As String
    Dim CrAmt1 As Long
    Dim crItem2 As String
    Dim CrAmt2 As Long
    Dim DrItem As String
    Dim DrRmk As String
    Dim DrAmt As Long
    Dim dt As Date

    Set sh1 = Sheets("一覧表")
    Set sh2 = Sheets("振伝")

    With sh2.Range("A1", sh2.UsedRange)
        If .Rows.Count > 14 Then
            .Offset(14).EntireRow.Delete
        End If
    End With

    Set copyFrom = sh2.Rows("1:14")

    '各行の取り出し
    For i = st To st + cnt - 1
        If pos Is Nothing Then  '最初
            Set pos = sh2.Range("A1")
        Else
            Set pos = pos.Offset(14) '次のブロック位置
            copyFrom.Copy pos
            Application.CutCopyMode = False
        End If
        'ブロックの初期化
        pos.Range("B6:I12").ClearContents
        pos.Range("K6:K12").ClearContents
        pos.Range("L6:M12").ClearContents
        setcnt = 0
        'ヘッダー項目
        crItem1 = sh1.Rows(i).Range("IY1").Value
        CrAmt1 = sh1.Rows(i).Range("IZ1").Value
        crItem2 = sh1.Rows(i).Range("JA1").Value
        CrAmt2 = sh1.Rows(i).Range("JB1").Value
        dt = sh1.Rows(i).Range("B1").Value
        newP = sh1.Rows(i).Range("C1").Value
        num = 1
        pos.Range("M2").Value = num
        pos.Range("B4").Value = dt
        pos.Range("N13").Value = newP
        pos.Range("N6").Value = crItem1
        pos.Range("S6").Value = CrAmt1
        pos.Range("N7").Value = crItem2
        pos.Range("S7").Value = CrAmt2
        '行内の借方項目の取り出し
        For j = Columns("D").Column To Columns("IS").Column Step 3
            DrRmk = sh1.Cells(i, j + 1).Value
            If DrRmk = "" Then Exit For    '借方適用が空白になれば、その行はおしまい
            DrItem = sh1.Cells(i, j).Value
            DrAmt = sh1.Cells(i, j + 2).Value
            If setcnt = 7 Then              '7項目セット済みならブロックを追加
                copyFrom.Copy pos.Offset(14)
                Application.CutCopyMode = False
                Set pos = pos.Offset(14)
                num = num + 1
                'ブロックの初期化
                pos.Range("M2").Value = num
                pos.Range("N13").Value = newP
                pos.Range("B6:I12").ClearContents
                pos.Range("K6:K12").ClearContents
                pos.Range("L6:M12").ClearContents
                pos.Range("N6").Value = Empty
                pos.Range("N7").Value = Empty
                pos.Range("S6").Value = Empty
                pos.Range("S7").Value = Empty
                setcnt = 0
            End If
            setcnt = setcnt + 1
            pos.Range("B6").Offset(setcnt - 1).Value = DrAmt
            pos.Range("K6").Offset(setcnt - 1).Value = DrItem
            pos.Range("L6").Offset(setcnt - 1).Value = DrRmk
        Next
        oldP = newP
    Next

 End Sub

 Sub 保存()
    Dim FileName As String
    Dim myDate As Date

    Sheets("振伝").Copy

    FileName = ThisWorkbook.Path & "\" & Month(myDate) & "月" & ".xlsx"

    With ActiveWorkbook
        myDate = .Sheets(1).Range("B4")
        FileName = ThisWorkbook.Path & "\" & Month(myDate) & "月" & ".xlsx"
        .Sheets(1).Name = Month(myDate) & "月"
        Application.DisplayAlerts = False   '同名ブックあれば無条件上書き
        .SaveAs FileName
        Application.DisplayAlerts = True
    End With

 End Sub

 Sub 一覧並び替え()
    Application.EnableEvents = False
    ReForm一覧
    Application.EnableEvents = True
 End Sub

  Sub ReForm一覧()
    Dim r As Range
    Dim c As Range
    Dim x As Long

    Application.EnableEvents = False
    With Sheets("一覧表")
        'テーブル解除
        On Error Resume Next
        .ListObjects(1).Unlist
        On Error GoTo 0

        Set r = .UsedRange

        '振伝順番リセット
        With CreateObject("Scripting.Dictionary")
            For Each c In Sheets("リスト").Range("No").Columns(1).Cells
                x = x + 1
                .Item(c.Value) = x
            Next
            For Each c In r.Columns("C").Offset(1).Resize(r.Rows.Count - 1).Cells
                c.EntireRow.Columns("JC").Value = .Item(c.Value)
            Next
        End With
        '並び替え
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=Columns("B"), Order:=xlAscending
        .Sort.SortFields.Add Key:=Columns("JC"), Order:=xlAscending
        With .Sort
            .SetRange r
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        'テーブル再設定
        .ListObjects.Add xlSrcRange, r, , xlYes
        .ListObjects(1).TableStyle = "TableStyleLight15"
        .Cells.Borders.LineStyle = xlNone
        .Cells.Interior.ColorIndex = xlNone

    End With
    Application.EnableEvents = True
 End Sub

【旧標準モジュール 2】
Option Explicit

 Sub 一回こっきり()
    Dim j As Long
    Dim i As Long

    Application.EnableEvents = False

    With Sheets("一覧表")
        On Error Resume Next
        .ListObjects(1).Unlist
        On Error GoTo 0
        .Cells.Borders.LineStyle = xlNone
        .Cells.Interior.ColorIndex = xlNone
        With .UsedRange
            For j = Columns("E").Column To Columns("IT").Column Step 3
                With .Columns(j)
                    .FormatConditions.Delete
                    .FormatConditions.Add Type:=xlExpression, Formula1:= _
                        "=COUNTIF(" & .Cells(1).Address(False, False) & ",""*事業所"")"
                    With .FormatConditions(1).Font
                        .Color = 255
                    End With
                    .FormatConditions.Add Type:=xlExpression, Formula1:= _
                        "=COUNTIF(" & .Cells(1).Address(False, False) & ",""*支店"")"
                    With .FormatConditions(2).Font
                        .Color = 255
                    End With
                End With
                With .Columns(j + 1)    '借方金額欄
                    .Offset(1).Resize(.Rows.Count - 1).NumberFormatLocal = "#,###"
                End With
            Next

            With .Columns("A")
                .Offset(1).Resize(.Rows.Count - 1).Formula = "=ROW()-1"
                .Offset(1).Resize(.Rows.Count - 1).Value = .Offset(1).Resize(.Rows.Count - 1).Value
            End With

            With .Columns("B")
                .Offset(1).Resize(.Rows.Count - 1).NumberFormatLocal = "m月d日"
            End With

            With .Columns("IZ")
                .Offset(1).Resize(.Rows.Count - 1).NumberFormatLocal = "#,###"
                For i = 2 To .Rows.Count - 1
                    .Cells(i).Value = SumDebit(Range(.Cells(i).EntireRow.Range("F1"), .Cells(i).EntireRow.Range("IU2"))) - .Cells(i).EntireRow.Range("JB1").Value
                Next
            End With

        End With

        .ListObjects.Add xlSrcRange, .UsedRange, , xlYes
        .ListObjects(1).TableStyle = "TableStyleLight15"

    End With

    With Sheets("振伝")
        With .Range("A1", .UsedRange)
            If .Rows.Count > 14 Then
                .Offset(14).EntireRow.Delete
            End If
        End With
        .Range("M2").ClearContents
        .Range("B4:K4").ClearContents
        .Range("B6:I12").ClearContents
        .Range("K6:K12").ClearContents
        .Range("L6:M12").ClearContents
        .Range("N6:R7").ClearContents
        .Range("N13:R13").ClearContents
        .Range("S6:Z7").ClearContents

        .Range("B4").NumberFormatLocal = "ggge年m月d日"
        .Range("B6:B12").NumberFormatLocal = "#,###"
        .Range("L6:M12").ShrinkToFit = True
        .Range("N13").Font.Size = 10
        .Range("S6").NumberFormatLocal = "(#,###);(-#,###);"""""
        .Range("S7").NumberFormatLocal = "(#,###);(-#,###);"""""
        With .Range("L1:L12")
            .FormatConditions.Delete
            .FormatConditions.Add Type:=xlExpression, Formula1:= _
                "=COUNTIF(" & .Cells(1).Address(False, False) & ",""*事業所"")"
            With .FormatConditions(1).Font
                .Color = 255
            End With
            .FormatConditions.Add Type:=xlExpression, Formula1:= _
                "=COUNTIF(" & .Cells(1).Address(False, False) & ",""*支店"")"
            With .FormatConditions(2).Font
                .Color = 255
            End With
        End With

    End With

    Application.EnableEvents = True

 End Sub

 Sub 一覧復旧()
    With Sheets("一覧表")
        On Error Resume Next
        .ListObjects(1).Unlist
        On Error GoTo 0
        .ListObjects.Add xlSrcRange, .UsedRange, , xlYes
        .ListObjects(1).TableStyle = "TableStyleLight15"
        .Cells.Borders.LineStyle = xlNone
        .Cells.Interior.ColorIndex = xlNone
    End With
 End Sub

【旧一覧表】

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim st As Long
    Dim cnt As Long

    If Intersect(Target, ListObjects(1).DataBodyRange) Is Nothing Then Exit Sub
    If Intersect(Target, Range("A:B")) Is Nothing Then Exit Sub

    Cancel = True
    Application.EnableEvents = False
    Application.ScreenUpdating = False

    Select Case Target.Column

        Case 1
            '選択された行のみの振伝作成(個別)
            make振伝 Target.Row, 1
            Worksheets("振伝").Select
        Case 2
            '選択された日付をもつデータの振伝作成(全て)
            ReForm一覧
            st = WorksheetFunction.Match(Target.EntireRow.Range("B1"), Columns("B"), 0)
            cnt = WorksheetFunction.CountIf(ListObjects(1).DataBodyRange.Columns("B"), Target)
            make振伝 st, cnt
            保存
    End Select

    Application.EnableEvents = True

 End Sub

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    Dim c As Range
    Dim i As Long

    '念のため入力あった行の数式とA列の連番を再セット

    Set r = Intersect(Target, ListObjects(1).DataBodyRange)
    If r Is Nothing Then Exit Sub

    Application.EnableEvents = False

    For Each c In r.Rows
        i = c.Row
        Rows(i).Range("IZ1").Value = SumDebit(Range("F" & i & ":IU" & i)) - Range("JB" & i).Value
        Rows(i).Range("A1").Value = i - 1
        '列幅自動調整
        c.EntireColumn.AutoFit
    Next

    Application.EnableEvents = True

 End Sub

【旧リスト】

 Private Sub Worksheet_Deactivate()
 Application.EnableEvents = False
    ReForm一覧
 Application.EnableEvents = True
 End Sub

【旧ThisWorkbook】

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Application.EnableEvents = False
    ReForm一覧
    With Sheets("一覧表")
        'テーブルの下のB列セルを選択
        Application.GoTo .Cells(.ListObjects(1).ListRows.Count + 2, "B")
    End With
    Application.EnableEvents = True
 End Sub

(新標準モジュール 1)

Option Explicit

 Function SumDebit(r As Range, Optional intvl = 3) As Variant
    Dim i As Long
    For i = 1 To r.Cells.Count Step intvl
        SumDebit = SumDebit + Val(r.Cells(i).Value)
    Next
 End Function

 Sub make振伝(st As Long, cnt As Long)
    Dim pos As Range
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim oldP As String
    Dim newP As String
    Dim i As Long
    Dim j As Long
    Dim num As Long
    Dim copyFrom As Range
    Dim setcnt As Long
    Dim crItem1 As String
    Dim CrAmt1 As String
    Dim crItem2 As String
    Dim CrAmt2 As Long
    Dim DrItem As String
    Dim DrRmk As String
    Dim DrAmt As Long
    Dim dt As Date

    Set sh1 = Sheets("一覧表")
    Set sh2 = Sheets("振伝")

    With sh2.Range("A1", sh2.UsedRange)
        If .Rows.Count > 14 Then
            .Offset(14).EntireRow.Delete
        End If
    End With

    Set copyFrom = sh2.Rows("1:14")
Stop
    '各行の取り出し
    For i = st To st + cnt - 1
        If pos Is Nothing Then  '最初
            Set pos = sh2.Range("A1")
        Else
            Set pos = pos.Offset(14) '次のブロック位置
            copyFrom.Copy pos
            Application.CutCopyMode = False
        End If
        'ブロックの初期化
        pos.Range("B6:I12").ClearContents
        pos.Range("K6:K12").ClearContents
        pos.Range("L6:M12").ClearContents
        setcnt = 0
        'ヘッダー項目
        'crItem1 = sh1.Rows(i).Range("G1").Value
        'CrAmt1 = sh1.Rows(i).Range("H1").Value
       ' crItem2 = sh1.Rows(i).Range("I1").Value
        'CrAmt2 = sh1.Rows(i).Range("J1").Value
        dt = sh1.Rows(i).Range("B1").Value
        newP = sh1.Rows(i).Range("C1").Value
        num = 1
        pos.Range("M2").Value = num
        pos.Range("B4").Value = dt
        pos.Range("N13").Value = newP
        '行内の借方項目の取り出し
        j = 5
        Do While Cells(i, 1).Value = Cells(i + 1, 1).Value

        'For j = Columns("D").Column To Columns("LF").Column Step 3
            DrRmk = sh1.Cells(i, j).Value
           ' If DrRmk = "" Then Exit For    '借方適用が空白になれば、その行はおしまい
            DrItem = sh1.Cells(i, j - 1).Value
            DrAmt = sh1.Cells(i, j + 1).Value
            crItem1 = sh1.Cells(i, j + 2).Value
            CrAmt1 = sh1.Cells(i, j + 3).Value
            crItem2 = sh1.Cells(i, j + 4).Value
            CrAmt2 = sh1.Cells(i, j + 5).Value
            If setcnt = 7 Then              '7項目セット済みならブロックを追加
                copyFrom.Copy pos.Offset(14)
                Application.CutCopyMode = False
                Set pos = pos.Offset(14)
                num = num + 1
                'ブロックの初期化
                pos.Range("M2").Value = num
                pos.Range("N13").Value = newP
                pos.Range("B6:I12").ClearContents
                pos.Range("K6:K12").ClearContents
                pos.Range("L6:M12").ClearContents
                pos.Range("N6").Value = Empty
                pos.Range("N7").Value = Empty
                pos.Range("S6").Value = Empty
                pos.Range("S7").Value = Empty
                setcnt = 0
            End If
            setcnt = setcnt + 1
            pos.Range("B6").Offset(setcnt - 1).Value = DrAmt
            pos.Range("K6").Offset(setcnt - 1).Value = DrItem
            pos.Range("L6").Offset(setcnt - 1).Value = DrRmk
            pos.Range("N6").Value = crItem1
            pos.Range("S6").Value = CrAmt1
            pos.Range("N7").Value = crItem2
            pos.Range("S7").Value = CrAmt2
        'Next
        i = i + 1
        Loop
        oldP = newP
    Next

 End Sub

 Sub 保存()
    Dim FileName As String
    Dim myDate As Date

    Sheets("振伝").Copy

    FileName = ThisWorkbook.Path & "\" & Month(myDate) & "月" & ".xlsx"

    With ActiveWorkbook
        myDate = .Sheets(1).Range("B4")
        FileName = ThisWorkbook.Path & "\" & Month(myDate) & "月" & ".xlsx"
        .Sheets(1).Name = Month(myDate) & "月"
        Application.DisplayAlerts = False   '同名ブックあれば無条件上書き
        .SaveAs FileName
        Application.DisplayAlerts = True
    End With

 End Sub

 Sub 一覧並び替え()
    Application.EnableEvents = False
    ReForm一覧
    Application.EnableEvents = True
 End Sub

  Sub ReForm一覧()
    Dim r As Range
    Dim c As Range
    Dim x As Long

    Application.EnableEvents = False
    With Sheets("一覧表")
        'テーブル解除
        On Error Resume Next
        .ListObjects(1).Unlist
        On Error GoTo 0

        Set r = .UsedRange

        '振伝順番リセット
        'With CreateObject("Scripting.Dictionary")
            'For Each c In Sheets("リスト").Range("No").Columns(1).Cells
               ' x = x + 1
                '.Item(c.Value) = x
            'Next
            'For Each c In r.Columns("C").Offset(1).Resize(r.Rows.Count - 1).Cells
               ' c.EntireRow.Columns("K").Value = .Item(c.Value)
            'Next
        'End With

        '並び替え
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=Columns("B"), Order:=xlAscending
        .Sort.SortFields.Add Key:=Columns("K"), Order:=xlAscending
        With .Sort
            .SetRange r
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        'テーブル再設定
        .ListObjects.Add xlSrcRange, r, , xlYes
        .ListObjects(1).TableStyle = "TableStyleLight15"
        .Cells.Borders.LineStyle = xlNone
        .Cells.Interior.ColorIndex = xlNone

     End With
    Application.EnableEvents = True
 End Sub

(新標準モジュール  2)

 Sub 一回こっきり()
    Dim j As Long
    Dim i As Long

    Application.EnableEvents = False

    With Sheets("一覧表")
        On Error Resume Next
        .ListObjects(1).Unlist
        On Error GoTo 0
        .Cells.Borders.LineStyle = xlNone
        .Cells.Interior.ColorIndex = xlNone
        With .UsedRange
            With .Columns("E")
                    .FormatConditions.Delete
                    .FormatConditions.Add Type:=xlExpression, Formula1:= _
                        "=COUNTIF(" & .Cells(1).Address(False, False) & ",""*事業所"")"
                    With .FormatConditions(1).Font
                        .Color = 255
                    End With
                    .FormatConditions.Add Type:=xlExpression, Formula1:= _
                        "=COUNTIF(" & .Cells(1).Address(False, False) & ",""*支店"")"
                    With .FormatConditions(2).Font
                        .Color = 255
                    End With
            End With

             .Range("B:J").EntireColumn.AutoFit
            With .Columns("F")
                .Offset(1).Resize(.Rows.Count - 1).NumberFormatLocal = "#,###"
            End With

            With .Columns("J")
                .Offset(1).Resize(.Rows.Count - 1).NumberFormatLocal = "#,###"
            End With

            With .Columns("A")
                .Offset(1).Value = "=ROW(C2)-1"
                .Offset(2).Resize(.Rows.Count - 1).Formula = "=IF(CONCATENATE(C3,L3)=CONCATENATE(C2,L2),A2,A2+1)"
            End With

            With .Columns("K")
                .Offset(1).Resize(.Rows.Count - 1).Formula = "=VLOOKUP(C2,テーブル1[[名前]:[振伝順番]],2,FALSE)"     '振伝順番
            End With

            'With .Columns("A")
                '.Offset(1).Resize(.Rows.Count - 1).Formula = "=ROW()-1"
                '.Offset(1).Resize(.Rows.Count - 1).Value = .Offset(1).Resize(.Rows.Count - 1).Value
           ' End With

            With .Columns("B")
                .Offset(1).Resize(.Rows.Count - 1).NumberFormatLocal = "m月d日"
            End With

            With .Columns("H")
                .Offset(1).Resize(.Rows.Count - 1).NumberFormatLocal = "#,###"
                .Offset(1).Resize(.Rows.Count - 1).Value = "=IF(A2<>A3,SUMIF(A$2:A2,A2,F$2)-SUMIF(A$2:A2,A2,J$2),"""")"
                'For i = 2 To .Rows.Count - 1
                   ' .Cells(i).Value = SumDebit(Range(.Cells(i).EntireRow.Range("F1"), .Cells(i).EntireRow.Range("LF1"))) - .Cells(i).EntireRow.Range("LM1").Value   '''''
                'Next
            End With

        End With

        .ListObjects.Add xlSrcRange, .UsedRange, , xlYes
        .ListObjects(1).TableStyle = "TableStyleLight15"

    End With

    With Sheets("振伝")
        With .Range("A1", .UsedRange)
            If .Rows.Count > 14 Then
                .Offset(14).EntireRow.Delete
            End If
        End With
        .Range("M2").ClearContents
        .Range("B4:K4").ClearContents
        .Range("B6:I12").ClearContents
        .Range("K6:K12").ClearContents
        .Range("L6:M12").ClearContents
        .Range("N6:R7").ClearContents
        .Range("N13:R13").ClearContents
        .Range("S6:Z7").ClearContents

        .Range("B4").NumberFormatLocal = "ggge年m月d日"
        .Range("B6:B12").NumberFormatLocal = "#,###"
        .Range("L6:M12").ShrinkToFit = True
        .Range("N13").Font.Size = 10
        .Range("S6").NumberFormatLocal = "(#,###);(-#,###);"""""
        .Range("S7").NumberFormatLocal = "(#,###);(-#,###);"""""
        With .Range("L1:L12")
            .FormatConditions.Delete
            .FormatConditions.Add Type:=xlExpression, Formula1:= _
                "=COUNTIF(" & .Cells(1).Address(False, False) & ",""*事業所"")"
            With .FormatConditions(1).Font
                .Color = 255
            End With
            .FormatConditions.Add Type:=xlExpression, Formula1:= _
                "=COUNTIF(" & .Cells(1).Address(False, False) & ",""*支店"")"
            With .FormatConditions(2).Font
                .Color = 255
            End With
        End With

    End With

    Application.EnableEvents = True

 End Sub
 Sub 一覧復旧()
    With Sheets("一覧表")
        On Error Resume Next
        .ListObjects(1).Unlist
        On Error GoTo 0
        .ListObjects.Add xlSrcRange, .UsedRange, , xlYes
        .ListObjects(1).TableStyle = "TableStyleLight15"
        .Cells.Borders.LineStyle = xlNone
        .Cells.Interior.ColorIndex = xlNone
    End With
 End Sub

 

< 使用 Excel:Excel2010、使用 OS:Windows7 >


補足です。

以前になかったL列の事業所はA列の番号を振るのにあたらしく増えました。
日付や名前が同じでも1番から番号を振りたいのでその場合に文字を入れる事にしました。

現在1500行までデータがあり、最終的に6000行ぐらいなる予定です。
(くろ) 2015/07/11(土) 10:48


 私がリンクを貼るのもいかがかと思いますが一応関連トピのリンクです。

[[20150618141702]] 『処理速度を早く、軽くしたい。』(くろ)
[[20150624210958]] 『処理速度を早く、軽くしたい。No.2』(くろ)

(β) 2015/07/11(土) 11:00


 レイアウトに関しては入力しやすいもの(前トピで推奨したリスト伝票に近いもの)になったと思います。
 着手の前に、いくつか質問・確認です。

 ・コードの現状

  新レイアウト対応のため、そちらで手をいれられたと思います(まだ、コードを読むというところまでいっていません)

  1.ある程度、動かして、そちらの思惑が実現している。あとは、目的のデータを縦の行から抽出できればOK というレベルですか?
  2.それにしては、一覧表上で、行追加、あるいは既存の行に変更を加えた際に IZ列に自動計算結果が記入されませんか?
    あるいは、リストシートを開き、一覧表シートに戻った時(Reform一覧が自動実行されるわけですが)
    テーブルそのものが、IZ列まで拡大してしまいませんか?
  2.Reform一覧で、振伝番号が再セットされるべきなんですが、コメントアウトされていますね?
    もはや、名前の優先順はなくなったということですか?
  3.それにしては、並び替えでは、この振伝順番をキーにしていますね?
    一方、追加された事業所列にたいしては並び替えキーにしていませんね?なぜですか?

 ・仕様・要件

  4.従来(旧振伝。以降、この呼称にします)は、同じ日の同じ人であっても、行がかわれば、振伝番号は 1 から採番されましたね。
    新振伝では、行がどこで変わったかわからない、なので、その判定基準として、事業所が同じなら旧振伝の1行に相当。
    事業所がかわれば、旧振伝の行がかわった状態。
    このような仕様ですね?
  5.旧振伝では A列ダブルクリックは、当該行のみが対象でしたが、新振伝では、その行と同じ人、同じ日付、同じ事業所をもつ
    複数行が対象ということですね?
  6.貸方項目について教えてください。
    旧振伝では、当該行の借方合計だったわけですが、新振伝では、この列の扱いはどうなっていますか?
    1行毎の数字(つまり、借方と同じ数字)ですか?
    それとも、先頭ないしは最後の行に、旧振伝の貸方と同じような内容で記載されるのですか?

(β) 2015/07/11(土) 17:13


 いったん、以下に追加提案をしましたが、まずは、今出ている要件をやっつけましょう。
 なので、以下に記載した追加提案は、いったん消します。

(β) 2015/07/11(土) 18:08


(β)さん

いつもお世話になってます。

・コードの現状

  
>>1.ある程度、動かして、そちらの思惑が実現している。あとは、目的のデータを縦の行から抽出できればOK というレベルですか?

 まだそこまでにレベルではなく、イメージでこうやったらできるかもと一覧表のレイアウトを変えて、振伝の転記の仕方を考えてるところで上手くいかず相談にいたりました。

>>2.それにしては、一覧表上で、行追加、あるいは既存の行に変更を加えた際に IZ列に自動計算結果が記入されませんか?

 IZ列とは旧のものですよね?わたしは追加してないですけど、何のことでしょうか?

    あるいは、リストシートを開き、一覧表シートに戻った時(Reform一覧が自動実行されるわけですが)
    テーブルそのものが、IZ列まで拡大してしまいませんか?

 テーブルはJC列まででした。

>>2.Reform一覧で、振伝番号が再セットされるべきなんですが、コメントアウトされていますね?

    もはや、名前の優先順はなくなったということですか?

 日付と振伝順番での並び替えは必要です。縦にデータを変更した時にあまりに時間がかかるので、
一回こっきりに入れました。(これで上手くいけばと試作段階なのですが)

>>3.それにしては、並び替えでは、この振伝順番をキーにしていますね?

    一方、追加された事業所列にたいしては並び替えキーにしていませんね?なぜですか?

  まだそこまで試せてなくて。すいません。
 入力時に連番にしたい部分は連続して入力しているので想定してませんでした。
 でももちろん後日追加もあるのでいわれてみて必要だということがわかりました。
 

・仕様・要件

>>4.従来(旧振伝。以降、この呼称にします)は、同じ日の同じ人であっても、行がかわれば、振伝番号は 1 から採番されましたね。

    新振伝では、行がどこで変わったかわからない、なので、その判定基準として、事業所が同じなら旧振伝の1行に相当。
事業所がかわれば、旧振伝の行がかわった状態。このような仕様ですね?

  はい、そのとおりです。ただ、事業所名がなく空欄の場合もあります。

    
>>5.旧振伝では A列ダブルクリックは、当該行のみが対象でしたが、新振伝では、その行と同じ人、同じ日付、同じ事業所をもつ
    複数行が対象ということですね?

 はい、そのとおりです。なのでわたしが考えたのは同じ数字をふるというものでした。

>>6.貸方項目について教えてください。

    旧振伝では、当該行の借方合計だったわけですが、新振伝では、この列の扱いはどうなっていますか?
    1行毎の数字(つまり、借方と同じ数字)ですか?
    それとも、先頭ないしは最後の行に、旧振伝の貸方と同じような内容で記載されるのですか?

  J列(合計2)、H列(合計1)の最終行に合計が出るようになってます。
  H=IF(A2<>A3,SUMIF(A$2:A2,A2,F$2)-SUMIF(A$2:A2,A2,J$2),"")

よろしくお願いします。

(くろ) 2015/07/12(日) 13:16


 >>IZ列とは旧のものですよね?わたしは追加してないですけど、何のことでしょうか?

 一覧表シートモジュールの Changeイベントで書きこんでいます。

 >>日付と振伝順番での並び替えは必要です。縦にデータを変更した時にあまりに時間がかかるので、
 >>一回こっきりに入れました。(これで上手くいけばと試作段階なのですが)

 一回こっきりは、名前の通り、「一回こっきり」で、本来は、最初に手作業で式や書式やテーブルの設定をすればいいのですが
 面倒かもしれないと思い、手作業の代わりに準備しただけのものです。

 で、実際のデータ入力では使われませんので、新規に追加した行の振伝順番が空白のままになりますね?
 また、仮に名前を変更した時には、変更しなければいけませんよね?

 ここは振り直し必須ですが、並び替えは並び替えでやらなければいけないわけで、並び替えキーが1つ増えたから遅くなるということは
 まず、考えられません。
 振伝順番の設定にもそんなに時間がかかるとは思えません。

 具体的に、どんな時に、どれぐらいおそかったですか?

 >>事業所名がなく空欄の場合もあります。

 空白という値の事業所だと思えばいいですね。
 つまり、同じ名前で2行続いていて、ともに事業所が空欄なら、この2行は同じ事業所、つまり、旧振伝の、同じ1行ということですね。

 >>なのでわたしが考えたのは同じ数字をふるというものでした。

 A列の連番のことですか? これは、そうしなくてもOKですし、逆に同じものでグルーピングして振りなおすほうが
 ロジックは面倒になりますよ。
 旧振伝同様、新振伝でも一覧表A列は、ただのかざり(?)として考えておきましょう。

 >>J列(合計2)、H列(合計1)の最終行に合計が出るようになってます。 
 >>H=IF(A2<>A3,SUMIF(A$2:A2,A2,F$2)-SUMIF(A$2:A2,A2,J$2),"") 

 なるほど、了解です。
 ただ、A列をただにかざりと考えていますので、う〜ん・・・
 ちょっと考えてみます。

 このレスで、いくつか質問していることの回答はいただきたいのですが、それはそれとして
 新振伝としての処理方式の構成を、考えはじめます。

(β) 2015/07/12(日) 19:24


 ちなみに、J列にはどんな式を入れようとしています?
 というか、貸方2合計は、旧振伝では入力項目でしたね。
 今回式をいれるとすると、貸方合計も貸方2合計も式??
 貸方2の金額はどうやってしていする予定ですか?

(β) 2015/07/12(日) 19:57


(β) さん

>>一覧表シートモジュールの Changeイベントで書きこんでいます。

Rows(i).Range("IZ1").Value = SumDebit(Range("F" & i & ":IU" & i)) - Range("JB" & i).Value
この部分ですか?私は書いてないです。(β) さんの作ったままです。

>> で、実際のデータ入力では使われませんので、新規に追加した行の振伝順番が空白のままになりますね?また、仮に名前を変更した時には、変更しなければいけませんよね?

そう思って関数にしたのですがダメなんですかね?

           With .Columns("K")
                .Offset(1).Resize(.Rows.Count - 1).Formula = "=VLOOKUP(C2,テーブル1[[名前]:[振伝順番]],2,FALSE)"     '振伝順番
            End With

>>ここは振り直し必須ですが、並び替えは並び替えでやらなければいけないわけで、並び替えキーが1つ増えたから遅くなるということは

 まず、考えられません。
 振伝順番の設定にもそんなに時間がかかるとは思えません。
 具体的に、どんな時に、どれぐらいおそかったですか?

Reform一覧が動く時です、リストシートから他のシートへ行った時や、保存のときです。
以前の横にデータの時は思わなかったんですが、ちょっと待つ感じなので変更してみたら
早くなったので。

ちなみにリストシートは名前の名義以外にも一覧表を入力するのに必要な特記事項が書いてあり
かなりの頻度でみるので、

Private Sub Worksheet_Deactivate()

 Application.EnableEvents = False
    ReForm一覧
 Application.EnableEvents = True
 End Sub

この部分は止めてます。
保存の時と、B列のダブルクリックの時で十分です。

>>空白という値の事業所だと思えばいいですね。

 つまり、同じ名前で2行続いていて、ともに事業所が空欄なら、この2行は同じ事業所、つまり、旧振伝の、同じ1行ということですね。

はいそのとおりです。

>>A列の連番のことですか? これは、そうしなくてもOKですし、逆に同じものでグルーピングして振りなおすほうが

 ロジックは面倒になりますよ。
 旧振伝同様、新振伝でも一覧表A列は、ただのかざり(?)として考えておきましょう。

 なるほど、了解です。

 ただ、A列をただにかざりと考えていますので、う〜ん・・・
 ちょっと考えてみます。

 A列はかざりで対応できるのならそれでお願いします。
 私にはそれ以外思いつかなかっただけなので。

>>ちなみに、J列にはどんな式を入れようとしています?

書き方が悪くてすいません。
J列は入力項目です。
式(H=IF(A2<>A3,SUMIF(A$2:A2,A2,F$2)-SUMIF(A$2:A2,A2,J$2),"") )はH列のみです。

(くろ) 2015/07/12(日) 21:05


 >>私は書いてないです。(β) さんの作ったままです。

 そうですよ。でも、他の部分もβが書いたものを、(くろ)さんが新振伝に合わせて手を入れたんですよね。
 で、ここは(くろ)さんが手を入れていなかったので指摘したんです。

 >>.Offset(1).Resize(.Rows.Count - 1).Formula = "=VLOOKUP(C2,テーブル1[[名前]:[振伝順番]],2,FALSE)"     '振伝順番

 一回こっきりのコードは見ていなかったので。確かにありましたね。
 ところで、テーブル1。これは、どのシートのテーブル名ですか?リストシートですか?一覧シートですか?
 リストシートだとしたら、そこにテーブルを設定したんですか?(こちらでは旧振伝のままなのでリストシートにはテーブル設定していません)
 で、そちらでは、これでうまくいってますか?

 まぁ、ここに式を入れておくというのは悪くはないと思いますが。

 >>ちなみにリストシートは名前の名義以外にも一覧表を入力するのに必要な特記事項が書いてあり 
 >>かなりの頻度でみるので、・・・・ 
 >>この部分は止めてます。 
 >>保存の時と、B列のダブルクリックの時で十分です。 

 見ただけで戻った時には、動かないようにしようと考えていたんですが、一覧表K列に式がうまくはいれば
 Deactivateを取り除いてもいいかもしれませんね。

 ただ・・・

 >>現在自分で変更したのは一回こっきりと標準モジュール1だけです。 

 と書いてあったので、WorkbookモジュールやSheetモジュールは変更がないのかなと思ってました。
 そのあたりは、双方のバージョンをあわせるためにも、正確に連絡してくださいね。

 それと

 >>B列のダブルクリックの時で十分です。 

 旧振伝は A列ダブルクリック時はreform一覧は確かに必要なかったんですが、こんどは
 旧振伝の1行が複数行になってますよね。
 ケースとしては、このブロックに、行追加した。で、それは一覧表のテーブルの一番下にある。
 なので、新振伝では A列ダブルクリック時にも並び替えが必要になりますよ。

 >>J列は入力項目です。 

 了解。ただし、すでに3行ほど入っていて、式で3行目の貸方合計が表示されている。
 入力者は、ここに(必要であれば)貸方合計2を入力するんでしょうね。
 で、もし、データ1行を追加した時、振伝作成時、それが並び替えられて、この4行目になると思いますが、
 その時は、貸方合計は4行目、貸方2合計は3行目という状況になりますね。
 まぁ、そういう状況がありうるということでコードを考えればいいんですけどね。

 じっくり考えますが、大変そう・・・・

 究極は、「本当のリスト伝票形式の入力」を提案しなきゃいけなくなるかもしれません。
 まぁ、それは、出たとこ勝負で。

(β) 2015/07/12(日) 21:39


 全体の新しい処理の流れ、構想的には70%ぐらいは固まってきました。
 それはさておき、ちょっと、中間報告というか、情報共有的に。

 1.旧振伝では テーブル解除->並び替え等->テーブル再設定 このような処理をしていました。
   理由は、当初の、テーブルハンドリングで、そちらで発生したトラブル、結局は原因は、並び替えユーザー設定リストの文字数の問題でしたが
   それがわからず、テーブルがゆえの何かがあるんだろうということで、そのようにしたわけですが、結局は、その必要はなく
   テーブルのまま、テーブル用の並び替えを行ってもOKでした。
 2.もう1つ、旧振伝で、当初、貸方金額計算をユーザー定義関数SumDebitをシート上に記載していたんですが、テーブル解除、テーブル再設定のたびに
   全体が再計算され、処理効率の足を引っ張りましたので、これを、マクロ内での計算に変更した経緯があります。
 3.今回、振伝順番他、シート上の計算式が増えるようですが、そうすると、この並び替えのたびのシート全体の再計算(しかも解除と再設定の2回)が
   発生することになります。
 4.なので、(↑の1.はテーブルが原因ではなかったわけですから)新振伝では、テーブル解除->並び替え等->テーブル再設定ではなく
   テーブルとしての並び替えを行うように変更する予定です。

 もう1つ。

 たとえば、そちらで手を入れた一回こっきりに

 >>.Offset(1).Resize(.Rows.Count - 1).Formula = "=VLOOKUP(C2,テーブル1[[名前]:[振伝順番]],2,FALSE)"     '振伝順番

 こういうところがありますよね。この中の テーブル1 は、(おそらくリストシートの)テーブル名なんですが、これは、仮に解除して再設定すると
 別の番号が振られます。テーブル名はブックを通して管理されますので、たとえば テーブル5 といったように。
 そうすると、このコードは、実行時エラーになってしまいます。

 回避策は

 A.旧振伝でβのコードがやっていたように、そのテーブル名を取得して、コードの中のテーブル名に、それを変数で与える。
 B.テーブル名を、システムデフォルトのテーブル○ではなく、たとえば "顧客リスト" とか "一覧表" という固定の名前にする。
   これは必要であればコード実行時にもできますが、操作で、テーブル○と割り振られたテーブルのテーブル名の名前ボックスで
   変更もできます。
  (新振伝では、テーブル解除、再設定は行わない予定ですが、一回こっきりなどでテーブルを再作成した際には名前がかわりますので要注意)

(β) 2015/07/13(月) 05:53


(β)さん

>>そうですよ。でも、他の部分もβが書いたものを、(くろ)さんが新振伝に合わせて手を入れたんですよね。で、ここは(くろ)さんが手を入れていなかったので指摘したんです。

すいません、現在自分で変更したのは一回こっきりと標準モジュール1だけです。と書いた意味は
まだこの部分以外は変更出来てないということを伝えたつもりでした。
なのでまだ、手つかずでした。

>>リストシートだとしたら、そこにテーブルを設定したんですか?(こちらでは旧振伝のままなのでリストシートにはテーブル設定していません)

 で、そちらでは、これでうまくいってますか?

Sheets("リスト").Range("No")とテーブル1[[名前]:[振伝順番]]?は同じ場所です。
前回の時からNoはテープル1になってます。今回書き方が分からなくてマクロの記録で書いたそのまま
を採用してます。説明不足ですいません。

>>WorkbookモジュールやSheetモジュールは変更がないのかなと思ってました。

 そのあたりは、双方のバージョンをあわせるためにも、正確に連絡してくださいね。

変更はないです。

>>ケースとしては、このブロックに、行追加した。で、それは一覧表のテーブルの一番下にある。

 なので、新振伝では A列ダブルクリック時にも並び替えが必要になりますよ。

なるほど、言われるとそうですね。

>>その時は、貸方合計は4行目、貸方2合計は3行目という状況になりますね。

 まぁ、そういう状況がありうるということでコードを考えればいいんですけどね。

ここまで想定できてませんでした。

>>こういうところがありますよね。この中の テーブル1 は、(おそらくリストシートの)テーブル名なんですが、これは、仮に解除して再設定すると

 別の番号が振られます。テーブル名はブックを通して管理されますので、たとえば テーブル5 といったように。
 そうすると、このコードは、実行時エラーになってしまいます。

テーブル名でなくて、Noで大丈夫です。

色々提案ありがとうございます。宜しくお願いします。

(くろ) 2015/07/13(月) 12:55


 >>変更はないです。

 でもDeactivateイベントは消したんですよね?

 まぁ、こうやろうかなという構想はほぼできあがりましたので、コード改定着手します。

(β) 2015/07/13(月) 13:25


(β)さん

>>でもDeactivateイベントは消したんですよね?

そうですね。
それは前回作ってもらった旧の方で消したので、
今回は変更ないってことだったのですが、伝えないと分からないですよね。
すいません。

宜しくお願いします。
(くろ) 2015/07/13(月) 13:37


 一応書いてみました。
 だいぶ、前のことを忘れている部分もあって、連番の取り方や貸方項目のセットの方法に間違いがあるかも。
 いずれにしても、レスを分けて、次のレスでコードをアップしますが、ここでは、まず、準備してもらいたいことを含めて
 メモ的に事前連絡。

 1.新振伝では、処理コードの中でテーブル解除->再設定はいっさい行わず、シートに存在するテーブルを、そのまま
   永久的に(?)使います。
 2.一覧表シートとリストシートのテーブルに固有の名前をつけます。
   前者が "一覧リスト"、後者が "名前リスト"
 3.テーブルの名前は、デーブル内を選択してデザインタブの一番左、テーブル名という箱がありますので、そこで規定してください。
   (一覧リストについては後述も参考に)
 4.そちらのスペックを継承し、H,K,M列(M列は後述)に式をセットしておき、マクロでは、演算をやめました。
   ただし、式そのものは、そちらのコードにあるものとはちょっと変えています。(後述)
 5.Reform一覧を、軽〜くしました。並び替えと飾り物のA列の番号振り直しだけです。(A列については後述)
 6.イベント処理も軽くしました。
   1)リストシートのDeActivateは廃止。
   2)一覧シートのChangeイベントは列幅自動調整のみ。
   3)WorkbookのBeforeSave では、reform一覧をやめ、最終行の次のB列の選択だけにしました。
 7.旧振伝の1行の認識
   そちらの構想では、この固まりごとにA列の番号をユニークに採番ということだったと思いますがコメントしたように
   様々な入力のケースを考えると現実的ではありません。
   で、あらたにM列を設けました。(このM列生成は後述)
   ここに 日付、名前、事業所を連結した文字列を計算式でもっておきます。このM列の値が同じものが旧振伝の1行に当たります。
 8.テーブルを使うにあたり、一覧シートのテーブル(一覧リスト)のタイトル文字で以下を指定しています。
   そちらのタイトルと合わなければ、コードを変更するなり、タイトルを変更するなりしてください。
   A列 連番、B列 日付、K列 振伝順番、L列 事業所。(いずれもreform一覧内でのみ参照)

 ★今回、一回こっきり、および、同じモジュールにある一覧復旧には手を付けていません。
  このままで大丈夫ということではなく、(このままでは大丈夫じゃないです)使う必要がないだろうということです。
  元々一回こっきりの役割は、計算式設定と書式設定、ならびにテーブル設定、それと並び替え。(一覧シート、振り伝シート)
  書式はすでに設定されていますので、もう設定の必要はないですね。並び替えもとりたてて必要ないですね。
  計算式とテーブル設定については次項で。

 ★一回こっきりの簡易版ですが、テーブル再設定 というマクロを準備。
  一覧シートに対して、M列を追加した上で計算式を埋め込み、M列を非表示にしてから、テーブル名を"一覧リスト"にしています。
  これは、計算式のセットのために、一度やっておいてください。
(β) 2015/07/14(火) 15:32

 で、コードです。これ以外のコードは消しておいてください。

 ●ThisWorkbookモジュール

 Option Explicit

 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Application.EnableEvents = False
    With Sheets("一覧表")
        'テーブルの下のB列セルを選択
        Application.Goto .Cells(.ListObjects("一覧リスト").ListRows.Count + 2, "B")
    End With
    Application.EnableEvents = True
 End Sub

 ●一覧シート シートモジュール

 Option Explicit

 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim st As Long
    Dim cnt As Long

    If Intersect(Target, ListObjects(1).DataBodyRange) Is Nothing Then Exit Sub
    If Intersect(Target, Range("A:B")) Is Nothing Then Exit Sub

    Cancel = True
    Application.EnableEvents = False
    Application.ScreenUpdating = False

    Select Case Target.Column

        Case 1
            '選択された行のみの振伝作成(個別)
            ReForm一覧
            st = WorksheetFunction.Match(Target.EntireRow.Range("M1"), Columns("M"), 0)
            cnt = WorksheetFunction.CountIf(ListObjects(1).DataBodyRange.Columns("M"), Target.EntireRow.Range("M1"))
            make振伝 st, cnt
            Worksheets("振伝").Select
        Case 2
            '選択された日付をもつデータの振伝作成(全て)
            ReForm一覧
            st = WorksheetFunction.Match(Target.EntireRow.Range("B1"), Columns("B"), 0)
            cnt = WorksheetFunction.CountIf(ListObjects(1).DataBodyRange.Columns("B"), Target)
            make振伝 st, cnt
            保存
    End Select

    Application.EnableEvents = True

 End Sub

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Range
    Dim c As Range
    Dim i As Long

    '入力あった列幅調整のみ

    Set r = Intersect(Target, ListObjects(1).DataBodyRange)
    If r Is Nothing Then Exit Sub

    Application.EnableEvents = False

    For Each c In r.Rows
        '列幅自動調整
        c.EntireColumn.AutoFit
    Next

    Application.EnableEvents = True

 End Sub

 ●標準モジュール(本番用)

 Option Explicit

 Sub make振伝(st As Long, cnt As Long)
    Dim pos As Range
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim oldKey As String
    Dim newKey As String
    Dim i As Long
    Dim j As Long
    Dim num As Long
    Dim copyFrom As Range
    Dim setcnt As Long
    Dim crItem1 As String
    Dim CrAmt1 As String
    Dim crItem2 As String
    Dim CrAmt2 As Long
    Dim DrItem As String
    Dim DrRmk As String
    Dim DrAmt As Long
    Dim dt As Date
    Dim n As Long

    Set sh1 = Sheets("一覧表")
    Set sh2 = Sheets("振伝")

    With sh2.Range("A1", sh2.UsedRange)
        If .Rows.Count > 14 Then
            .Offset(14).EntireRow.Delete
        End If
    End With

    Set copyFrom = sh2.Rows("1:14")

    '各行の取り出し
    For i = st To st + cnt - 1
        newKey = sh1.Rows(i).Range("M1")
        If oldKey <> newKey Then
            If pos Is Nothing Then          '最初
                Set pos = sh2.Range("A1")
            Else
                Set pos = pos.Offset(14)    '次のブロック位置
                copyFrom.Copy pos
                Application.CutCopyMode = False
            End If
            'ブロックの初期化
            pos.Range("B6:I12").ClearContents
            pos.Range("K6:K12").ClearContents
            pos.Range("L6:M12").ClearContents
            setcnt = 0
            num = num + 1
            '貸方項目、ヘッダー項目
            dt = sh1.Rows(i).Range("B1").Value
            n = WorksheetFunction.CountIf(sh1.ListObjects(1).DataBodyRange.Columns("M"), newKey)
            If n > 1 Then
                crItem1 = Join(WorksheetFunction.Transpose(sh1.Rows(i).Range("G1").Resize(n).Value), "")
                crItem2 = Join(WorksheetFunction.Transpose(sh1.Rows(i).Range("I1").Resize(n).Value), "")
                CrAmt1 = WorksheetFunction.SumIf(sh1.Rows(i).Range("M1").Resize(n), newKey, sh1.Rows(i).Range("H1").Resize(n))
                CrAmt2 = WorksheetFunction.SumIf(sh1.Rows(i).Range("M1").Resize(n), newKey, sh1.Rows(i).Range("J1").Resize(n))
            Else
                crItem1 = sh1.Rows(i).Range("G1").Value
                crItem2 = sh1.Rows(i).Range("I1").Value
                CrAmt1 = sh1.Rows(i).Range("H1").Value
                CrAmt2 = sh1.Rows(i).Range("J1").Value
            End If
        End If

        '借方項目のセット
        DrRmk = sh1.Rows(i).Range("D1").Value
        DrItem = sh1.Rows(i).Range("E1").Value
        DrAmt = sh1.Rows(i).Range("F1").Value

        If setcnt >= 7 Then              '7項目セット済みならブロックを追加

             copyFrom.Copy pos.Offset(14)
             Application.CutCopyMode = False
             Set pos = pos.Offset(14)
             num = num + 1
             'ブロックの初期化
             pos.Range("M2").Value = num
             pos.Range("B4").Value = dt
             pos.Range("N13").Value = sh1.Rows(i).Range("C1").Value
             pos.Range("B6:I12").ClearContents
             pos.Range("K6:K12").ClearContents
             pos.Range("L6:M12").ClearContents
             pos.Range("N6").Value = Empty
             pos.Range("N7").Value = Empty
             pos.Range("S6").Value = Empty
             pos.Range("S7").Value = Empty
             setcnt = 0

        End If

        setcnt = setcnt + 1

        pos.Range("B6").Offset(setcnt - 1).Value = DrAmt
        pos.Range("K6").Offset(setcnt - 1).Value = DrItem
        pos.Range("L6").Offset(setcnt - 1).Value = DrRmk
        pos.Range("N6").Value = crItem1
        pos.Range("S6").Value = CrAmt1
        pos.Range("N7").Value = crItem2
        pos.Range("S7").Value = CrAmt2

        oldKey = newKey

    Next

 End Sub

 Sub 保存()
    Dim FileName As String
    Dim myDate As Date

    Sheets("振伝").Copy

    FileName = ThisWorkbook.Path & "\" & Month(myDate) & "月" & ".xlsx"

    With ActiveWorkbook
        myDate = .Sheets(1).Range("B4")
        FileName = ThisWorkbook.Path & "\" & Month(myDate) & "月" & ".xlsx"
        .Sheets(1).Name = Month(myDate) & "月"
        Application.DisplayAlerts = False   '同名ブックあれば無条件上書き
        .SaveAs FileName
        Application.DisplayAlerts = True
    End With

 End Sub

 Sub ReForm一覧()
    Dim r As Range
    Dim c As Range
    Dim x As Long

    With Sheets("一覧表")

        '並び替え
        .ListObjects("一覧リスト").Sort.SortFields.Clear
        .ListObjects("一覧リスト").Sort.SortFields.Add Key:=Range("一覧リスト[日付]"), SortOn:=xlSortOnValues, Order:=xlAscending
        .ListObjects("一覧リスト").Sort.SortFields.Add Key:=Range("一覧リスト[振伝順番]"), SortOn:=xlSortOnValues, Order:=xlAscending
        .ListObjects("一覧リスト").Sort.SortFields.Add Key:=Range("一覧リスト[事業所]"), SortOn:=xlSortOnValues, Order:=xlAscending
        With .ListObjects("一覧リスト").Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With

        'A列連番振り直し
        .Range("A2").Value = 1
        Range("一覧リスト[連番]").DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, Step:=1, Trend:=False

    End With

 End Sub

 ●標準モジュール(臨時)

 Option Explicit

 Sub テーブル再設定()
    Dim fm As String
    Dim tmp As Variant

    Application.EnableEvents = False

    fm = "=IF(M2<>M3,SUMIF(一覧表!$M$2:$M$@,M2,一覧表!$F$2:$F$@)-SUMIF(一覧表!$M$2:$M$@,M2,一覧表!$J$2:$J$@),"""")"

    With Sheets("一覧表")
        On Error Resume Next
        .ListObjects(1).Unlist
        On Error GoTo 0
        .Cells.Interior.ColorIndex = xlNone
        .Cells.Borders.LineStyle = xlNone
        With .UsedRange
            fm = Replace(fm, "@", .Rows.Count - 1)
            .Columns("H").Offset(1).Resize(.Rows.Count - 1).Formula = fm
            .Columns("K").Offset(1).Resize(.Rows.Count - 1).Formula = "=IFERROR(VLOOKUP(C2,名前リスト,2,FALSE),"""")"
            .Columns("M").Cells(1).Value = "キー"
            .Columns("M").Offset(1).Resize(.Rows.Count - 1).Formula = "=TEXT(B2,""yymmdd"")&C2&IF(L2="""","" "",L2)"
            '以下は念のため
            With .Columns("J").Offset(1).Resize(.Rows.Count - 1)
                tmp = .Value
                .ClearContents
                .Value = tmp
            End With
        End With

        With .ListObjects.Add(xlSrcRange, .UsedRange, , xlYes)
            .Name = "一覧リスト"
            .TableStyle = "TableStyleLight15"
        End With

        'キー列を非表示
        .Columns("M").Hidden = True

    End With

    Application.EnableEvents = True

 End Sub

(β) 2015/07/14(火) 15:36


(β)さん

丸投げ状態ですいません。ありがとうございます。
動きがかなり軽いです。

1.A列 連番、B列 日付、K列 振伝順番、L列 事業所へタイトル変更

2.テーブル再設定を実行

3.名前名義 No→名前リストに変更

4.A列をダブルクリック

5.make振伝
  '借方項目のセット

        DrRmk = sh1.Rows(i).Range("D1").Value          
        DrItem = sh1.Rows(i).Range("E1").Value        
 を
  '借方項目のセット
        DrRmk = sh1.Rows(i).Range("E1").Value          
        DrItem = sh1.Rows(i).Range("D1").Value        
 に変更

ここまでやりました。

1.A列の連番が壊れた?row()-1の番号になりました。

2.振伝の1枚目の番号と名前が空白です。

宜しくお願いします。

(くろ) 2015/07/14(火) 16:58


 1.A列

   ROW()-1 という式は新振伝では使っていないんですが、エクセル行番号よ1つ少ない数ということなら
   それでいいと思いますが? データ行は最初が2行目ですよね。

 2.番号、名前

   コードの記述を忘れてました。

        '借方項目のセット

   このコメントの上に

        'ヘッダー項目のセット
        pos.Range("M2").Value = num
        pos.Range("B4").Value = dt
        pos.Range("N13").Value = sh1.Rows(i).Range("C1").Value

   を追加してください。

(β) 2015/07/14(火) 17:17


(β) さん

ありがとうございます。

>>1.A列
 私の勘違いです、M列の結果が出るのかと思ってました。
 これで問題ないです。

小出しですいません。

1.貸方の金額が2枚目以降も出てきます。1枚目のみの表示にしたいです。

2.B列でダブルクリックした場合、Noが全ての連番になってます。
 A列での結果と同じにしたいです。

宜しくお願いします。
(くろ) 2015/07/14(火) 17:46


 やはり、しばらく間を置くと、すっかり、いろんなことを忘れてますねぇ。

 make振伝いれかえです。(まだまだ、いろいろあるかもしれませんので検証よろしく)

 Sub make振伝(st As Long, cnt As Long)
    Dim pos As Range
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim oldKey As String
    Dim newKey As String
    Dim i As Long
    Dim j As Long
    Dim num As Long
    Dim copyFrom As Range
    Dim setcnt As Long
    Dim crItem1 As String
    Dim CrAmt1 As String
    Dim crItem2 As String
    Dim CrAmt2 As Long
    Dim DrItem As String
    Dim DrRmk As String
    Dim DrAmt As Long
    Dim dt As Date
    Dim n As Long

    Set sh1 = Sheets("一覧表")
    Set sh2 = Sheets("振伝")

    With sh2.Range("A1", sh2.UsedRange)
        If .Rows.Count > 14 Then
            .Offset(14).EntireRow.Delete
        End If
    End With

    Set copyFrom = sh2.Rows("1:14")

    '各行の取り出し
    For i = st To st + cnt - 1
        newKey = sh1.Rows(i).Range("M1")
        If oldKey <> newKey Then
            If pos Is Nothing Then          '最初
                Set pos = sh2.Range("A1")
            Else
                Set pos = pos.Offset(14)    '次のブロック位置
                copyFrom.Copy pos
                Application.CutCopyMode = False
            End If
            'ブロックの初期化
            pos.Range("B6:I12").ClearContents
            pos.Range("K6:K12").ClearContents
            pos.Range("L6:M12").ClearContents
            setcnt = 0
            num = 1
            '貸方項目、ヘッダー項目
            dt = sh1.Rows(i).Range("B1").Value
            n = WorksheetFunction.CountIf(sh1.ListObjects(1).DataBodyRange.Columns("M"), newKey)
            If n > 1 Then
                crItem1 = Join(WorksheetFunction.Transpose(sh1.Rows(i).Range("G1").Resize(n).Value), "")
                crItem2 = Join(WorksheetFunction.Transpose(sh1.Rows(i).Range("I1").Resize(n).Value), "")
                CrAmt1 = WorksheetFunction.SumIf(sh1.Rows(i).Range("M1").Resize(n), newKey, sh1.Rows(i).Range("H1").Resize(n))
                CrAmt2 = WorksheetFunction.SumIf(sh1.Rows(i).Range("M1").Resize(n), newKey, sh1.Rows(i).Range("J1").Resize(n))
            Else
                crItem1 = sh1.Rows(i).Range("G1").Value
                crItem2 = sh1.Rows(i).Range("I1").Value
                CrAmt1 = sh1.Rows(i).Range("H1").Value
                CrAmt2 = sh1.Rows(i).Range("J1").Value
            End If
        End If

        'ヘッダー項目のセット
        pos.Range("M2").Value = num
        pos.Range("B4").Value = dt
        pos.Range("N13").Value = sh1.Rows(i).Range("C1").Value
        pos.Range("N6").Value = crItem1
        pos.Range("S6").Value = CrAmt1
        pos.Range("N7").Value = crItem2
        pos.Range("S7").Value = CrAmt2

        '借方項目のセット
        DrRmk = sh1.Rows(i).Range("E1").Value
        DrItem = sh1.Rows(i).Range("D1").Value
        DrAmt = sh1.Rows(i).Range("F1").Value

        If setcnt >= 7 Then              '7項目セット済みならブロックを追加

             copyFrom.Copy pos.Offset(14)
             Application.CutCopyMode = False
             Set pos = pos.Offset(14)
             num = num + 1
             'ブロックの初期化
             pos.Range("M2").Value = num
             pos.Range("B4").Value = dt
             pos.Range("N13").Value = sh1.Rows(i).Range("C1").Value
             pos.Range("B6:I12").ClearContents
             pos.Range("K6:K12").ClearContents
             pos.Range("L6:M12").ClearContents
             pos.Range("N6").Value = Empty
             pos.Range("N7").Value = Empty
             pos.Range("S6").Value = Empty
             pos.Range("S7").Value = Empty
             setcnt = 0

        End If

        setcnt = setcnt + 1

        pos.Range("B6").Offset(setcnt - 1).Value = DrAmt
        pos.Range("K6").Offset(setcnt - 1).Value = DrItem
        pos.Range("L6").Offset(setcnt - 1).Value = DrRmk

        oldKey = newKey

    Next

 End Sub

(β) 2015/07/14(火) 18:31


(β)さん

いえいえ、変なお願いばかりですいません。

やはり貸方の合計金額がすべての振伝に出てきます。
よろしくお願いします。
(くろ) 2015/07/14(火) 19:27


 こちらでは、とりあえず8行が1つのデータがあって、それに対して、A列ダブルクリックでも、B列ダブルクリックでも
 2枚目の1行だけのほうには、貸方金額が転記されず、空白になっているんですが?

 そちらでは、貸方項目の文字列も該当の振伝すべてに記載されてしまっているんですか?

(β) 2015/07/14(火) 20:39


 あっ!! 今、1組のデータを行コピーで21行にして実行すると再現しました。
 ただ、テーブル上の式の結果も、ちょっと変なところがあります。このあたりが影響しているのか?

 調べます。

(β) 2015/07/14(火) 20:44


(β)さん

データが8行・15行・22行までの時は1枚目のみが転記されて、2枚目3枚目は空白なのですが、
それ以上のデータになると記入されます。
9行〜14行・16行〜21行・23行〜28行にも入力データがある場合です。
(くろ) 2015/07/14(火) 21:20


 make振伝 と テーブル再設定を リバイス願います。

 で、一覧シートのタイトルの縛りが増えました。
 M列 キー、これはテーブル再設定で、すでにそうしています。ただ、今まではコード内では使っていなかったのですが式で使うようになりますので。
 F列 金額、J列 合計2 。これらも式で使います。

 で、タイトルを直したら一度、テーブル再設定を実行してください。

 あと、コードアップ量が多かったので、このスレも、いっぱいいっぱいになってきましたね。
 また皆さんから指導が入るかもしれませんので、No2 を立ち上げてもらえますか?

 Sub make振伝(st As Long, cnt As Long)
    Dim pos As Range
    Dim sh1 As Worksheet
    Dim sh2 As Worksheet
    Dim oldKey As String
    Dim newKey As String
    Dim i As Long
    Dim j As Long
    Dim num As Long
    Dim copyFrom As Range
    Dim setcnt As Long
    Dim crItem1 As String
    Dim CrAmt1 As String
    Dim crItem2 As String
    Dim CrAmt2 As Long
    Dim DrItem As String
    Dim DrRmk As String
    Dim DrAmt As Long
    Dim dt As Date
    Dim n As Long

    Set sh1 = Sheets("一覧表")
    Set sh2 = Sheets("振伝")

    With sh2.Range("A1", sh2.UsedRange)
        If .Rows.Count > 14 Then
            .Offset(14).EntireRow.Delete
        End If
    End With

    Set copyFrom = sh2.Rows("1:14")

    '各行の取り出し
    For i = st To st + cnt - 1
        newKey = sh1.Rows(i).Range("M1")
        If oldKey <> newKey Then
            If pos Is Nothing Then          '最初
                Set pos = sh2.Range("A1")
            Else
                Set pos = pos.Offset(14)    '次のブロック位置
                copyFrom.Copy pos
                Application.CutCopyMode = False
            End If
            'ブロックの初期化
            pos.Range("B6:I12").ClearContents
            pos.Range("K6:K12").ClearContents
            pos.Range("L6:M12").ClearContents
            setcnt = 0
            num = 1
            '貸方項目、ヘッダー項目
            dt = sh1.Rows(i).Range("B1").Value
            n = WorksheetFunction.CountIf(sh1.ListObjects(1).DataBodyRange.Columns("M"), newKey)
            If n > 1 Then
                crItem1 = Join(WorksheetFunction.Transpose(sh1.Rows(i).Range("G1").Resize(n).Value), "")
                crItem2 = Join(WorksheetFunction.Transpose(sh1.Rows(i).Range("I1").Resize(n).Value), "")
                CrAmt1 = WorksheetFunction.SumIf(sh1.Rows(i).Range("M1").Resize(n), newKey, sh1.Rows(i).Range("H1").Resize(n))
                CrAmt2 = WorksheetFunction.SumIf(sh1.Rows(i).Range("M1").Resize(n), newKey, sh1.Rows(i).Range("J1").Resize(n))
            Else
                crItem1 = sh1.Rows(i).Range("G1").Value
                crItem2 = sh1.Rows(i).Range("I1").Value
                CrAmt1 = sh1.Rows(i).Range("H1").Value
                CrAmt2 = sh1.Rows(i).Range("J1").Value
            End If

            pos.Range("N6").Value = crItem1
            pos.Range("S6").Value = CrAmt1
            pos.Range("N7").Value = crItem2
            pos.Range("S7").Value = CrAmt2

        End If

        'ヘッダー項目のセット
        pos.Range("M2").Value = num
        pos.Range("B4").Value = dt
        pos.Range("N13").Value = sh1.Rows(i).Range("C1").Value

        '借方項目のセット
        DrRmk = sh1.Rows(i).Range("E1").Value
        DrItem = sh1.Rows(i).Range("D1").Value
        DrAmt = sh1.Rows(i).Range("F1").Value

        If setcnt >= 7 Then              '7項目セット済みならブロックを追加

             copyFrom.Copy pos.Offset(14)
             Application.CutCopyMode = False
             Set pos = pos.Offset(14)
             num = num + 1
             'ブロックの初期化
             pos.Range("M2").Value = num
             pos.Range("B4").Value = dt
             pos.Range("N13").Value = sh1.Rows(i).Range("C1").Value
             pos.Range("B6:I12").ClearContents
             pos.Range("K6:K12").ClearContents
             pos.Range("L6:M12").ClearContents
             pos.Range("N6").Value = Empty
             pos.Range("N7").Value = Empty
             pos.Range("S6").Value = Empty
             pos.Range("S7").Value = Empty
             setcnt = 0

        End If

        setcnt = setcnt + 1

        pos.Range("B6").Offset(setcnt - 1).Value = DrAmt
        pos.Range("K6").Offset(setcnt - 1).Value = DrItem
        pos.Range("L6").Offset(setcnt - 1).Value = DrRmk

        oldKey = newKey

    Next

 End Sub

 Sub テーブル再設定()
    Dim fm As String
    Dim tmp As Variant

    Application.EnableEvents = False

    fm = "=IF(一覧リスト[@キー]<>M3,SUMIF(一覧リスト[キー],一覧リスト[@キー],一覧リスト[金額])-SUMIF(一覧リスト[キー],一覧リスト[@キー],一覧リスト[合計2]),"""")"

    With Sheets("一覧表")
        On Error Resume Next
        .ListObjects(1).Unlist
        On Error GoTo 0
        .Cells.Interior.ColorIndex = xlNone
        .Cells.Borders.LineStyle = xlNone
        With .UsedRange
            .Columns("K").Offset(1).Resize(.Rows.Count - 1).Formula = "=IFERROR(VLOOKUP(C2,名前リスト,2,FALSE),"""")"
            .Columns("M").Cells(1).Value = "キー"
            .Columns("M").Offset(1).Resize(.Rows.Count - 1).Formula = "=TEXT(B2,""yymmdd"")&C2&IF(L2="""","" "",L2)"
            '以下は念のため
            With .Columns("J").Offset(1).Resize(.Rows.Count - 1)
                tmp = .Value
                .ClearContents
                .Value = tmp
            End With
        End With

        With .ListObjects.Add(xlSrcRange, .UsedRange, , xlYes)
            .Name = "一覧リスト"
            .TableStyle = "TableStyleLight15"
        End With
        With .UsedRange
            .Columns("H").Offset(1).Resize(.Rows.Count - 1).Value = fm
        End With
        'キー列を非表示
        .Columns("M").Hidden = True

    End With

    Application.EnableEvents = True

 End Sub

(β) 2015/07/14(火) 21:27


(β) さん

ありがとうございます。
新しいコードに変更したら上手くいきました。
かなりいいものになって、入力もラクになり色々ありがとうございました。
困ったことや質問があれば、No2を立てますのでよろしくお願いします。
(くろ) 2015/07/14(火) 22:57


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.