|
▼ima さん:
こんばんは。
一応、imaさんのご希望に沿うようなコードにしたつもりです。
前回のコードと比較して下さい。変更点は、ちょっとしたところですから・・。
'====================================================================
Option Explicit
'====================================================================
Sub 統合2()
Dim newshtnm()
Dim oldshtnm()
Dim idx As Long
Dim 元ブック As Workbook
Dim 集計ブック As Workbook
Dim total_sht As Worksheet
idx = 0
Set 元ブック = ActiveWorkbook
With 元ブック
ReDim oldshtnm(1 To .Worksheets.Count, 1 To 1)
For idx = 1 To Worksheets.Count
oldshtnm(idx, 1) = .Worksheets(idx).Name
Next
End With
newshtnm() = Range("a1", Cells(Rows.Count, 1).End(xlUp).Offset(-2, 0)).Value
Set 集計ブック = mk_book(newshtnm())
With 集計ブック
For idx = 1 To .Worksheets.Count
With .Worksheets(idx)
.Range("a1:c1").Value = Array("シート番号", "回答", "文字数")
.Range("d2:d" & UBound(oldshtnm(), 1) + 1).Value = oldshtnm()
.Range("a2:a" & UBound(oldshtnm(), 1) + 1).Formula = _
"=row()-1"
.Range("b2:b" & UBound(oldshtnm(), 1) + 1).Formula = _
"=if(indirect(ADDRESS(" & idx & ",2,,,""[" & 元ブック.Name & "]""&d2))="""",""""," & _
"indirect(ADDRESS(" & idx & ",2,,,""[" & 元ブック.Name & "]""&d2)))"
.Range("c2:c" & UBound(oldshtnm(), 1) + 1).Formula = _
"=len(b2)"
.Cells(UBound(oldshtnm(), 1) + 2, 3).Formula = _
"=sum(c2:c" & UBound(oldshtnm(), 1) + 1 & ")"
With .Range("a2:b" & UBound(oldshtnm(), 1) + 1)
.Value = .Value
End With
.Range("d2:d" & UBound(oldshtnm(), 1) + 1).Value = ""
End With
Next
Set total_sht = .Worksheets.Add(after:=.Worksheets(.Worksheets.Count))
' ↓ここから、トータルシートの作成
With total_sht
.Name = "トータルシート"
.Range("a1:b1").Value = Array("シート名", "文字数小計")
.Range("a2:a" & UBound(newshtnm(), 1) + 1).Value = newshtnm()
.Range("b2:b" & UBound(newshtnm(), 1) + 1).Value = _
"=indirect(address(" & UBound(oldshtnm(), 1) + 2 & ",3,,,a2))"
.Cells(UBound(newshtnm(), 1) + 2, 2).Formula = _
"=sum(b2:b" & UBound(newshtnm(), 1) + 1 & ")"
End With
End With
End Sub
'====================================================================
Function mk_book(shtnm()) As Workbook
Dim idx As Long
Set mk_book = Workbooks.Add
With mk_book
For idx = LBound(shtnm()) To UBound(shtnm())
If idx > .Worksheets.Count Then
.Worksheets.Add after:=.Worksheets(.Worksheets.Count)
End If
.Worksheets(idx).Name = shtnm(idx, 1)
Next idx
End With
End Function
マクロ実行は前回と同様に元ブックをアクティブにして実行して下さい。
>集計ブック-Sheet1(Q1のシート)
> A列 B列 C列
>1 シート番号 回答 文字数
>2 1 ○○○ 3
>・ 2 ●●●● 4
>・ ・ ・ ・
>・ ・ ・ ・
>・ X \\\ 3
>
>集計ブック-最後のSheet(回答者)
> A列 B列 C列
>1 シート番号 回答 文字数
>2 1 AAAA 4
>・ 2 BBBB 4
>・ ・ ・ ・
>・ ・ ・ ・
>・ X YYYY 4
>
>もうひとつは、最終目的である、各回答の文字数の総計を新しいシートに出したいのです。イメージとしては、集計ブックの新しいシートに下記のようなものができればよいのですが・・(レイアウトは問いません)
>
> A列 B列
>1 シート名 文字数小計
>2 Q1 (上記集計ブック-Sheet1のC列の合計値)
>3 Q2 (Sheet2のC列の合計値)
>・ ・ ・
>・ ・ ・
>z QX (最後の質問のSheetのC列の合計値)
>z+1 (B2:Bzの総計)
ほぼ、↑のように集計されるはずです。
数式をそのまま残しておきましたので、
例えば、集計ブックのQ1のB列(回答)を修正した場合、
C列の文字数に反映しますし、トータルシートの合計値も変更されるように
してあります。
>説明不足ですみません。
いいえ、これだけの仕様を提示して頂きました。
わかりやすかったですよ!!(まっ、これで仕様と違ったら、私の読解力不足です)
私が書いたコードは、せいぜい60ステップ程度ですが、
そのための仕様書となったら、最初の投稿と合わせてこれだけ書かなければならないということですよね?
この手の質問は、「仕様書を書く」勉強になるかも?
何はともあれ、確認して下さい。
|
|