[[20081216183241]] 『Sheet1を基準に各作業員の配当』(配当) ページの最後に飛ぶ

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

 

『Sheet1を基準に各作業員の配当』(配当)
 はじめましてよろしくお願いいたします。

 Sheet1が原本になります。									
	A	B	C	D	E	F	AK	AL	AM
	日付	曜日	あ	い	う	え	作業員A	作業員B	作業員C
5	2007/11/1	木	10	11	12	13	○	○	○
6	2007/11/2	金	10	11	12	13	○	○	×
7	2007/11/3	土	10	11	12	13	○	×	×
8	2007/11/4	日	10	11	12	13	×	○	○
9	2007/11/5	月	10	11	12	13	×	×	○
Sheet2に作業員Aの配当									
	A	B	C	D	E	F	AK		
	日付	曜日	あ	い	う	え	作業員A		
5	2007/11/1	木	3	3	4	4	○		
6	2007/11/2	金	5	5	6	6	○		
7	2007/11/3	土	10	11	12	13	○		
8	2007/11/4	日	0	0	0	0	×		
9	2007/11/5	月	0	0	0	0	×		
Sheet3に作業員Bの配当									
	A	B	C	D	E	F	AK		
	日付	曜日	あ	い	う	え	作業員B		
5	2007/11/1	木	3	3	4	4	○		
6	2007/11/2	金	5	5	6	6	○		
7	2007/11/3	土	0	0	0	0	×		
8	2007/11/4	日	5	5	6	6	○		
9	2007/11/5	月	0	0	0	0	×		
Sheet4に作業員Cの配当									
	A	B	C	D	E	F	AK		
	日付	曜日	あ	い	う	え	作業員C		
5	2007/11/1	木	3	3	4	4	○		
6	2007/11/2	金	0	0	0	0	×		
7	2007/11/3	土	0	0	0	0	×		
8	2007/11/4	日	5	5	6	6	○		
9	2007/11/5	月	10	11	12	13	○		

 上記のようにSheet1を原本としてSheet2,Sheet3,Sheet4へ		
 各、作業員へ配当分を集計したいのですが可能でしょうか?		
 割れないであまりが出た場合は切り捨てて(10だとして3人○ならば10÷3で各3 ずつ配当)		
 できればマクロ?でなんて		
 :マクロを実行すると”メッセージボックス”が出てきて		
 開始の日付は?終わりは?と出てきてその当てはまる日数のみを集計(配当)する何て 出来ればと思い書きました。
 (日付は2〜3年分入っています)		
 よろしくお願いいたします。	

 無理ではないですかね〜
 因みにSheet1をSheet2〜Sheet4に指定した日付のデータをコピーと言う具合でかな?
 (スガリ)

 ありがとうございます。やはりそうですか
 私は初心者ですがこの学校のやり取りを見ていてエクセルで不可能は
 あまり無いような気がしまして今回質問しました。(配当)


 出来ないことないですよ。
 提示された条件で組んでみました。
 (ROUGE)
'----
Sub Dividend()
Dim tbl, ans(), i As Long, ii As Long, n As Integer, x(3 To 6) As Long, iii As Long, ss
With Sheets("Sheet1")
    tbl = .Range("A4", .Range("A" & Rows.Count).End(xlUp)).Resize(, 39).Value
End With
ReDim ans(1 To UBound(tbl, 1), 1 To 37, 1 To 3)
For i = 1 To 3
    For ii = 1 To 36
        ans(1, ii, i) = tbl(1, ii)
    Next
    ans(1, 37, i) = tbl(1, 36 + i)
Next
For i = 2 To UBound(tbl, 1)
    n = IIf(tbl(i, 37) = "○", 1, 0) + IIf(tbl(i, 38) = "○", 1, 0) + _
        IIf(tbl(i, 39) = "○", 1, 0)
    For iii = 3 To 6
        x(iii) = tbl(i, iii) \ n
    Next
    For ii = 1 To 3
        ans(i, 1, ii) = tbl(i, 1)
        ans(i, 2, ii) = tbl(i, 2)
        ans(i, 37, ii) = tbl(i, 36 + ii)
        For iii = 3 To 6
            ans(i, iii, ii) = IIf(ans(i, 37, ii) = "○", x(iii), 0)
        Next
    Next
Next
iii = 0
For Each ss In Array("Sheet2", "Sheet3", "Sheet4")
    iii = iii + 1
    ReDim tbl(1 To UBound(ans, 1), 1 To UBound(ans, 2))
    For i = 1 To UBound(tbl, 1)
        For ii = 1 To UBound(tbl, 2)
            tbl(i, ii) = ans(i, ii, iii)
        Next
    Next
    With Sheets(ss)
        .Range("A4", .Range("A" & Rows.Count).End(xlUp)).Resize(, 39).ClearContents
        .Range("A4").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl
    End With
Next
End Sub

 (ROUGE)さんありがとうございます。
 ビックリで感動しました。
 でも一つだけA列の日付の指定をしては無理なのでしょうか?
 (エラーが出て数字の入っていない部分の日付を消したら出来ました)
 説明不足で追加
 :マクロを実行すると”メッセージボックス”が出てきて		
 開始の日付は?終わりは?と出てきてその当てはまる日数のみを集計の事です。
(配当)


 こんな塩梅でどうでしょうか。
(ROUGE)
'----
Sub Dividend()
Dim tbl, ans(), i As Long, ii As Long, iii As Long, iv As Long, n As Integer, x(3 To 6) As Long, ss
Dim sDate As Date, eDate As Date
sDate = Application.InputBox("開始日を指定してください。", "開始日", _
    Format(WorksheetFunction.Min(Sheets("Sheet1").Range("A:A")), "yyyy/mm/dd"), Type:=1)
eDate = Application.InputBox("終了日を指定してください。", "終了日", _
    Format(WorksheetFunction.Max(Sheets("Sheet1").Range("A:A")), "yyyy/mm/dd"), Type:=1)
If eDate < sDate Then
    MsgBox "指定された日付は正しくありません。", vbExclamation, "エラー"
    Exit Sub
End If
With Sheets("Sheet1")
    tbl = .Range("A4", .Range("A" & Rows.Count).End(xlUp)).Resize(, 39).Value
End With
ReDim ans(1 To UBound(tbl, 1), 1 To 37, 1 To 3)
For i = 1 To 3
    For ii = 1 To 36
        ans(1, ii, i) = tbl(1, ii)
    Next
    ans(1, 37, i) = tbl(1, 36 + i)
Next
iv = 1
For i = 2 To UBound(tbl, 1)
    If tbl(i, 1) >= sDate And tbl(i, 1) <= eDate Then
        iv = iv + 1
        n = IIf(tbl(i, 37) = "○", 1, 0) + IIf(tbl(i, 38) = "○", 1, 0) + _
            IIf(tbl(i, 39) = "○", 1, 0)
        For iii = 3 To 6
            x(iii) = tbl(i, iii) \ n
        Next
        For ii = 1 To 3
            ans(iv, 1, ii) = tbl(i, 1)
            ans(iv, 2, ii) = tbl(i, 2)
            ans(iv, 37, ii) = tbl(i, 36 + ii)
            For iii = 3 To 6
                ans(iv, iii, ii) = IIf(ans(iv, 37, ii) = "○", x(iii), 0)
            Next
        Next
    End If
Next
iii = 0
For Each ss In Array("Sheet2", "Sheet3", "Sheet4")
    iii = iii + 1
    ReDim tbl(1 To UBound(ans, 1), 1 To UBound(ans, 2))
    For i = 1 To UBound(tbl, 1)
        For ii = 1 To UBound(tbl, 2)
            tbl(i, ii) = ans(i, ii, iii)
        Next
    Next
    With Sheets(ss)
        .Range("A4", .Range("A" & Rows.Count).End(xlUp)).Resize(, 39).ClearContents
        .Range("A4").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl
    End With
Next
End Sub

 (ROUGE)ありがとうございます。
 しかし、A〜FまではコピーででるのですがG〜AJまでが
 全部コピーされなくて?最初のと比べてみたのですが分からなくて
 何度も申し訳ございません(配当)


 G:AJもなんかあるんですね。。。(当然かwww)
 (ROUGE)
'----
Sub Dividend()
Dim tbl, ans(), i As Long, ii As Long, iii As Long, iv As Long, n As Integer, x(3 To 6) As Long, ss
Dim sDate As Date, eDate As Date
sDate = Application.InputBox("開始日を指定してください。", "開始日", _
    Format(WorksheetFunction.Min(Sheets("Sheet1").Range("A:A")), "yyyy/mm/dd"), Type:=1)
eDate = Application.InputBox("終了日を指定してください。", "終了日", _
    Format(WorksheetFunction.Max(Sheets("Sheet1").Range("A:A")), "yyyy/mm/dd"), Type:=1)
If eDate < sDate Then
    MsgBox "指定された日付は正しくありません。", vbExclamation, "エラー"
    Exit Sub
End If
With Sheets("Sheet1")
    tbl = .Range("A4", .Range("A" & Rows.Count).End(xlUp)).Resize(, 39).Value
End With
ReDim ans(1 To UBound(tbl, 1), 1 To 37, 1 To 3)
For i = 1 To 3
    For ii = 1 To 36
        ans(1, ii, i) = tbl(1, ii)
    Next
    ans(1, 37, i) = tbl(1, 36 + i)
Next
iv = 1
For i = 2 To UBound(tbl, 1)
    If tbl(i, 1) >= sDate And tbl(i, 1) <= eDate Then
        iv = iv + 1
        n = IIf(tbl(i, 37) = "○", 1, 0) + IIf(tbl(i, 38) = "○", 1, 0) + _
            IIf(tbl(i, 39) = "○", 1, 0)
        For iii = 3 To 6
            x(iii) = tbl(i, iii) \ n
        Next
        For ii = 1 To 3
            ans(iv, 1, ii) = tbl(i, 1)
            ans(iv, 2, ii) = tbl(i, 2)
            ans(iv, 37, ii) = tbl(i, 36 + ii)
            For iii = 3 To 6
                ans(iv, iii, ii) = IIf(ans(iv, 37, ii) = "○", x(iii), 0)
            Next
            For iii = 7 To 36
                ans(iv, iii, ii) = tbl(i, iii)
            Next
        Next
    End If
Next
iii = 0
For Each ss In Array("Sheet2", "Sheet3", "Sheet4")
    iii = iii + 1
    ReDim tbl(1 To UBound(ans, 1), 1 To UBound(ans, 2))
    For i = 1 To UBound(tbl, 1)
        For ii = 1 To UBound(tbl, 2)
            tbl(i, ii) = ans(i, ii, iii)
        Next
    Next
    With Sheets(ss)
        .Range("A4", .Range("A" & Rows.Count).End(xlUp)).Resize(, 39).ClearContents
        .Range("A4").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl
    End With
Next
End Sub

 ありがとうございます。
 ただコピーと言いましたがコピーではなくて最初に書きました
10だとして3人○ならば10÷3で各3 ずつ配当)なのですが
 何度も申し訳ございません。
 A〜Fは上記のようになっていて完璧です。(配当)

 何度も申し訳ございません。
 現在(ROUGE)さんの2回目に教えていただいたマクロでいろいろ
 数字を変更して行っているのですがやはりA〜Fまでしか
 2回目の式でどこを変更すればSheet2〜Sheet4のA〜AJに
 配当がだせるのでしょうか?教えていただけないでしょうか?(配当)

 おはようございます。
 Fは6番目なのでマクロ内の6の部分を(AJは36)
 と言うことで変えてみましたところ出来ましたが今後なにか問題が
 発生するかと心配で、変更部分は下記の三箇所で行いました。
 Dim tbl, ans(), i As Long, ii As Long, iii As Long, iv As Long, n As Integer, x(3 To 6) As Long, ss ←(6を36)

        For iii = 3 To 6 ←(6を36)

            For iii = 3 To 6 ←(6を36)
 (配当)


 こうなったということですよね?
F:AJにも数値が入っていたんですね。
何かが分からなかったので、そのまま載せるようにしていました(滝汗
(ROUGE)
'----
Sub Dividend()
Dim tbl, ans(), i As Long, ii As Long, iii As Long, iv As Long, n As Integer, x(3 To 36) As Long, ss
Dim sDate As Date, eDate As Date
sDate = Application.InputBox("開始日を指定してください。", "開始日", _
    Format(WorksheetFunction.Min(Sheets("Sheet1").Range("A:A")), "yyyy/mm/dd"), Type:=1)
eDate = Application.InputBox("終了日を指定してください。", "終了日", _
    Format(WorksheetFunction.Max(Sheets("Sheet1").Range("A:A")), "yyyy/mm/dd"), Type:=1)
If eDate < sDate Then
    MsgBox "指定された日付は正しくありません。", vbExclamation, "エラー"
    Exit Sub
End If
With Sheets("Sheet1")
    tbl = .Range("A4", .Range("A" & Rows.Count).End(xlUp)).Resize(, 39).Value
End With
ReDim ans(1 To UBound(tbl, 1), 1 To 37, 1 To 3)
For i = 1 To 3
    For ii = 1 To 36
        ans(1, ii, i) = tbl(1, ii)
    Next
    ans(1, 37, i) = tbl(1, 36 + i)
Next
iv = 1
For i = 2 To UBound(tbl, 1)
    If tbl(i, 1) >= sDate And tbl(i, 1) <= eDate Then
        iv = iv + 1
        n = IIf(tbl(i, 37) = "○", 1, 0) + IIf(tbl(i, 38) = "○", 1, 0) + _
            IIf(tbl(i, 39) = "○", 1, 0)
        For iii = 3 To 36
            x(iii) = tbl(i, iii) \ n
        Next
        For ii = 1 To 3
            ans(iv, 1, ii) = tbl(i, 1)
            ans(iv, 2, ii) = tbl(i, 2)
            ans(iv, 37, ii) = tbl(i, 36 + ii)
            For iii = 3 To 36
                ans(iv, iii, ii) = IIf(ans(iv, 37, ii) = "○", x(iii), 0)
            Next
        Next
    End If
Next
iii = 0
For Each ss In Array("Sheet2", "Sheet3", "Sheet4")
    iii = iii + 1
    ReDim tbl(1 To UBound(ans, 1), 1 To UBound(ans, 2))
    For i = 1 To UBound(tbl, 1)
        For ii = 1 To UBound(tbl, 2)
            tbl(i, ii) = ans(i, ii, iii)
        Next
    Next
    With Sheets(ss)
        .Range("A4", .Range("A" & Rows.Count).End(xlUp)).Resize(, 39).ClearContents
        .Range("A4").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl
    End With
Next
End Sub

 ありがとうございます。
 変更したのと上記の(ROUGE)さんのを印刷をかけて
 重ねて透かして見比べてました。
 同じです。何度も何度もありがとうございました。
 又、問題が出たらよろしくお願いいたします。(配当)

 先日は本当にありがとうございました。
 過去の書き込みを見ながら”自動記録”で下記の事を行おうとしたのですが
 Sheet5に計算式が残ってしまい記録でリンクの貼り付けを行っているから
 だと思うのですが&実行した時に変な動きがあります。
 下記の事を行いたいのですが

 Sheet2のA5:AJ35を→ Sheet5のA6:AJ36内にコピー
 Sheet3のA5:AJ35を→ Sheet5のA45:AJ75内にコピー
 Sheet4のA5:AJ35を→ Sheet5のA84:AJ114内にコピー

 Sub Macro3()
'
' Macro3 Macro
'

'

    Sheets("Sheet2").Select
    ActiveWindow.SmallScroll Down:=-6
    Range("A5:AJ35").Select
    ActiveWindow.ScrollColumn = 7
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 5
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 1
    ActiveWindow.SmallScroll Down:=-15
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Sheet5").Select
    ActiveWindow.SmallScroll Down:=-12
    Range("A6").Select
    ActiveSheet.Paste Link:=True
    ActiveWindow.SmallScroll Down:=24
    Sheets("Sheet3").Select
    ActiveWindow.SmallScroll Down:=-39
    Range("A5:AJ35").Select
    ActiveWindow.SmallScroll Down:=-18
    ActiveWindow.ScrollColumn = 7
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 5
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 1
    ActiveWindow.SmallScroll Down:=15
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Sheet5").Select
    ActiveWindow.SmallScroll Down:=12
    Range("A45").Select
    ActiveSheet.Paste Link:=True
    ActiveWindow.SmallScroll Down:=30
    Sheets("Sheet4").Select
    ActiveWindow.SmallScroll Down:=-33
    Range("A5:AJ35").Select
    ActiveWindow.SmallScroll Down:=-24
    ActiveWindow.ScrollColumn = 10
    ActiveWindow.ScrollColumn = 9
    ActiveWindow.ScrollColumn = 8
    ActiveWindow.ScrollColumn = 7
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 5
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 1
    ActiveWindow.SmallScroll Down:=9
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Sheet5").Select
    ActiveWindow.SmallScroll Down:=15
    Range("A84").Select
    ActiveSheet.Paste Link:=True
    ActiveWindow.SmallScroll Down:=24
    Range("G119").Select
 End Sub

 このように記録されました。
 よろしくお願いいたします。(配当)


 「変な動き」と思われる動きは
 具体的にどの様な動きでしょう?

 【リンク】貼り付けをしたいのですよね。

 (HANA)

 画面がチラチラと言うか計算しているみたいです。
 リンクと言うのが間違えかもしれません。
 Sheet2.Sheet3.Sheet4の指定範囲ないの数字を上記に書きましたSheetに
 =○○ではなくて値で数字を移行できればなんですが/
 ↑実行すると各Sheetの=○○で
 (Sheet5の罫線等は消さないで、あくまで数字のみを)
 なんですが説明不足で申し訳ございません。(配当)


 マクロの記録を録るときは
 シート間の作業はシートを切り替えて記録します。
 セルを選択するときも、実際にそのセルを選択します。
 その動きがそのまま記録され
 プログラムはそれらの切換を瞬く間に行って仕舞うため
 画面がちらちらします。

 出来たコードから不要部分を削除して
 Selectしないコードに変更しすれば
 画面のちらつきは押さえられると思います。

 また、数字のみをコピーしたい場合は
 『値貼り付け(V)』で貼り付けてください。

 '------
Sub Macro3()
    Sheets("Sheet2").Range("A5:AJ35").Copy
    Sheets("Sheet5").Range("A6").PasteSpecial Paste _
        :=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Sheets("Sheet3").Range("A5:AJ35").Copy
    Sheets("Sheet5").Range("A45").PasteSpecial Paste _
        :=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Sheets("Sheet4").Range("A5:AJ35").Copy
    Sheets("Sheet5").Range("A84").PasteSpecial Paste _
        :=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Application.CutCopyMode = False
    Sheets("Sheet5").Range("G119").Select
End Sub
 '------

 (HANA)

コメント返信:

[ 一覧(最新更新順) ]


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