[[20131010150519]] 『8部門から送られてくるデータを配布名簿として自動的に作成したい』 (ととろ)  ページの最後に飛ぶ

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

 

『8部門から送られてくるデータを配布名簿として自動的に作成したい』 (ととろ)

1.ExcelVBAを使って、8部門から送られてくるデータシートを一つの配布名簿シートへ、
  自動的に取り込む(転記)ようにしたい。
  ※8部門から送られてくるデータシートは、配布名簿シートと同じブックに取り込み(複写)ます。

2.データシートのデータ項目は11項目あります。転記元の内容は変わることはありますが(見出しを除く)、
  転記先の配布名簿シートの見出し部分の11項目は固定で変わることはありませんので、転記開始行は2行目
  から転記開始となるようにしたいです。

3.8部門から送られてくるデータシートを選択した(単一(シート毎))順に選ぶか、一括(全選択(8部門@8シート分)
  選択したら処理ボタンを押すことで転記する処理を行えるようにしたいです。
  
4.配布名簿に取り込む(転記)する動作は、配布番号が変わるまで転記を行い、配布番号が変わったら
  配布担当者の件数を算出し表示し、終わるまで繰り返すようにしたいです。

5.始めに配布名簿シートへ転記した処理の繰り返しが終わったら、残りのデータシートの転記を4.と同じように繰り返し、
  8部門分のデータシートの転記が終わるまで繰り返し処理を出来る様にしたいです。

6.データシートの転記の順序については、データシート1の次にデータシート3とかデータシート7等
  順不同な処理は、複雑すぎて保守が難しくなると思うので、必ず、データシート1から順に行いたい
  です。

7.毎年(毎年度)この作業を行えるようにしたいです。

[シート構成]
 1.操作手順書
 2.メニューシート
 3.データシート※8部門分@8シート
[機能]
 1.データシートを選択できる方式にしたいです。
   ※単独または一括処理いずれか出来る方法があれば、出来るようにしたいです。

 2.処理開始ボタン ※データシート選択後、処理ボタンを押下することで処理(転記)
   を開始しするようにしたいです。

 3.保存ボタン
   ※配布名簿シートを別のブックに保存することで、内容に誤りがあった場合でも、
   何回でも処理することを可能にしたいです。

 4.終了ボタン
   ※ExcelBookを全て閉じるようにしたいです。

 [配布シートのレイアウト] 
No:Data1:Data2:Data3:氏名:Data5:Data6:住所:Data8:Data9:担当者名 
 1 asjsjdk   fjtrutur  fnfhjryur 安恵 jkfhjfurui kfdjfghush 東京 kdfgsfhgwk ghkshgushg 配布太郎
 1 asjsjdk   fjtrutur  fnfhjryur 豚平 jkfhjfurui kfdjfghush 京都 kdfgsfhgwk ghkshgushg 配布穂希
 1 asjsjdk   fjtrutur  fnfhjryur 庵叙 jkfhjfurui kfdjfghush 大阪 kdfgsfhgwk ghkshgushg 配布三郎
 1 asjsjdk   fjtrutur  fnfhjryur 光明 jkfhjfurui kfdjfghush 長野 kdfgsfhgwk ghkshgushg 配布権蔵
 1 asjsjdk   fjtrutur  fnfhjryur 尊保 jkfhjfurui kfdjfghush 群馬 kdfgsfhgwk ghkshgushg 配布菊代
 :  :      :     :    :    :    :   :    :     :     : 
 :  :      :     :    :    :    :   :    :     :     : 
 :  :      :     :    :    :    :   :    :     :     : 
 :  :      :     :    :    :    :   :    :     :     : 
 :  :      :     :    :    :    :   :    :     :     : 
                                                   XXX件

[Data条件]
この処理は、年度が変わるたびに作成するので、8部門から送られてくるデータシートの内容は毎年増減しますので、
これを考慮したい。

[今まで、アドバイスいただいて作成したコード]
・ Sub 広報用シート編集処理2のところで、8データシートを全て転記しようとすると、8データシート全てにおいて配布担当者件数が表示されたり、
件数が表示されなかったりとか、転記すべきデータシートが抜けていたりという現象が発生しているので、是非ともアドバイスを頂きたい
です。

'対象シート表示処理

 Private Sub 対象シート表示_Click()
'    If 終了処理_Click() = True Then
'       Call 終了
'    Else
       With Me.ListBox1
            Application.DisplayStatusBar = True
            Application.StatusBar = "マクロ実行中です…。"
            .MultiSelect = fmMultiSelectMulti
            .ListStyle = fmListStyleOption
            .List = Split(WshNames)
        End With
'    End If
 End Sub
'広報用シート編集処理1
 Private Sub 広報用シート編集_Click()
     Dim lastRow As Long
     Dim i As Integer
     Dim isFirstProc As Boolean
     ThisWorkbook.Sheets("広報用").Cells.ClearContents
     With Me.ListBox1
         For i = 0 To .ListCount - 1
             If .Selected(i) Then
                 If Not isFirstProc Then
                     isFirstProc = True
                          ThisWorkbook.Sheets("広報用").Range("A1:K1").Value _
                        = ThisWorkbook.Sheets(.List(i)).Range("A1:K1").Value
                 End If
                 Call 広報用シート編集処理2(.List(i))
             End If
         Next i
     End With
  End Sub
'広報用シート編集処理2
 Sub 広報用シート編集処理2(SheetNameToProc As String)
    Dim i&, j&, n&, S$, No$
    Dim Su&, v, w
       v = ThisWorkbook.Sheets(SheetNameToProc).Cells(1, 1).CurrentRegion.Value
       ReDim w(2 To UBound(v) * 2, 1 To 11) '展開用配列準備
'       For i = 1 To 11
'          w(1, i) = v(1, i)
'       Next
       No = v(2, 1): n = 1
       For i = 2 To UBound(v)
          n = n + 1
          If v(i, 1) = No Then
             Su = Su + 1
          Else
             w(n, 11) = Su & " 件": Su = 1: No = v(i, 1)
             n = n + 1
          End If
          For j = 1 To 11
             w(n, j) = v(i, j)
          Next
       Next
       n = n + 1
       w(n, 11) = Su & " 件"
       n = n + 1
'       w(n, 10) = "合計": w(n, 11) = (UBound(v) - 1) & " 件"
       With ThisWorkbook.Sheets("広報用")
             .Cells(Rows.Count, "J").End(xlUp).EntireRow.Cells(1, 1).Offset(1, 0).Resize(n, 11).Value = w
       End With
  End Sub
'広報用シート編集処理3
 Private Function WshNames()
     Dim ws As Worksheet
     Dim strWshName As String
     For Each ws In ThisWorkbook.Worksheets
         Select Case ws.Name
             Case "運用について", "1.運用の流れ", _
                  "2.配布名簿データーシートの書式統一", _
                  "作成手順", "メニュー", "広報用"
                 'do nothing
             Case Else
                 strWshName = strWshName & " " & ws.Name
         End Select
     Next
     WshNames = Trim(strWshName)
 End Function
'広報用データシート保存処理
 Private Sub 保存_clic()
     Sheets("広報用").Select
     Sheets("広報用(写)").Copy
     ActiveWorkbook.SaveAs Filename:= _
     "C:\Documents and Settings\xxxx\My Documents\Bookxx.xls", FileFormat:=xlNormal _
     , Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
     CreateBackup:=False
     ActiveWindow.Close
 End Sub
'終了処理
Private Sub 終了処理_Click()

     Application.StatusBar = False
     Application.StatusBar = "マクロ実行終了しました。"
'広報用シートのデータクリア
    For i = 6 To 6
     Worksheets(i).Range("A2:K1048576").Value = ""
    Next
    Sheets("メニュー").Select
    Range("A1").Select
'不要なシートの再表示
'     Sheets("メニュー").Select
'     Range("A1").Select
'
    Dim k As Integer
    For k = 1 To 4
        Sheets(k).Visible = True   '---ユーザーからは全く見えない
    Next k
'全ての Book を保存して閉じる
'最後に Excel も終了する
    Dim w As Workbook
    '全ての Book を保存する
    For Each w In Workbooks
        w.Save
    Next
    'Excel を終了する
    Application.Quit
    MsgBox "処理を終了します。 お疲れ様でしたしましたm(_ _)m"
    'Book を閉じる
    ThisWorkbook.Close False
End Sub

[Excel2010]

 [Windows7] 

上記の内容で、上手く伝わるか自信がありませんが、どうしても完成させたいので、
皆様からのアドバイスを是非頂きたいので、よろしくお願い致します。


 こんばんは

 なかなか伝わらないですね。

 With ThisWorkbook.Sheets("広報用")
     .Cells(Rows.Count, "J").End(xlUp).EntireRow.Cells(1, 1).Offset(1, 0).Resize(n, 11).Value = w
 End With

 "J"でいいのですか?
 '       w(n, 10) = "合計": w(n, 11) = (UBound(v) - 1) & " 件"
 ってコメントアウトされているので、"K"のような気がします。

 もし"J"なら、w(n, 10) = "合計"は生かしておかないとまずいのでは?

 コードを見る限り「配布番号」はA列で、しかもソートされているか同じ配布番号は行が連続していますよね?
 とすれば、集計使っても良さそうです。

 Sub 広報用シート編集処理2(SheetNameToProc As String)
    Dim r As Range
    Dim t As Range
    Dim s As Range

    Application.DisplayAlerts = False
    With ThisWorkbook.Sheets(SheetNameToProc)
        .Cells(1, 1).CurrentRegion.Subtotal _
            GroupBy:=1, Function:=xlCount, TotalList:=Array(11), _
            Replace:=True, PageBreaks:=False, SummaryBelowData:=True

        Set t = .Cells(1, 1).CurrentRegion.Offset(1)

        Set r = ThisWorkbook.Sheets("広報用").Cells(Rows.Count, "J").End(xlUp).EntireRow.Cells(2, 1)

        r.Resize(t.Rows.Count - 2, t.Columns.Count).Value = t.Value

        On Error Resume Next
        For Each s In r.Offset(, 1).Resize(t.Rows.Count - 2, 1).SpecialCells(xlCellTypeBlanks).Cells
            s.EntireRow.Cells(1, 1).ClearContents
            With s.EntireRow.Cells(1, t.Columns.Count)
                .Offset(, -1).Value = "合計"
                .Value = .Value & "件"
            End With
        Next
        On Error GoTo 0
        .UsedRange.RemoveSubtotal
    End With
    Application.DisplayAlerts = True
 End Sub

 とか。

 (ウッシ)


ウッシ様
早速のフォローありがとうございます。

>こんばんは
>なかなか伝わらないですね。
 →すみませんm(_ _)m
>With ThisWorkbook.Sheets("広報用")
> .Cells(Rows.Count, "J").End(xlUp).EntireRow.Cells(1, 1).Offset(1, 0).Resize(n, 11).Value = w
> End With
>"J"でいいのですか?
>' w(n, 10) = "合計": w(n, 11) = (UBound(v) - 1) & " 件"
>ってコメントアウトされているので、"K"のような気がします。
>もし"J"なら、w(n, 10) = "合計"は生かしておかないとまずいのでは?
 →配布担当者氏名をカウントして件数を表示できればいいので、コメントアウト
  しております。
>コードを見る限り「配布番号」はA列で、しかもソートされているか同じ配布番号は行が連続していますよね?
>とすれば、集計使っても良さそうです。
→おっしゃる通り、「配布番号」はA列で昇順で且つ行は連続しています。

頑張って、皆様に伝わるよう書いたのですが文才が無く伝わり辛いようですね(汗)
お手数お掛けしてすみませんm(_ _)m

今回の配布名簿作成するまでの流れをもおう一度記載したいと思います。

1.8部門からデータシートが送られてきます。※つまり、データシートは8シートになります。

2.1.を配布名簿作成ブックに取り込み(複写)します。

3.取り込(複写)んだ8シートを転記元として、配布名簿シートを転記先とします。
  シートの選択方法は、単体または全選択のどちらか選択できる方式にしたいです。

4.3.の転記先に8シートの内容を全て(見出し部分を除く)を転記します。

5.配布番号は、担当者毎に振られていますので、配布番号が変わったら担当者の件数を表示します。
  件数が分かればいいので、合計は表示しなくてもよいと思っています。

6.5.の処理が終ったら、続けて転記を行います。これをデータが無くなるまで行います。

7.6.データシート1を転記先に転記し終ったら、データシート2を次に転記先に転記をします。
  これを、データシート8まで繰り返します。

追伸、以下の揮ごうでくくられている箇所のコードで、現在inputboxを使用しいるのですが、
何か他に良い方法がありましたら、皆様からのアドバイスをよろしくお願い致します。

'対象シート表示処理                      --------------¬

 Private Sub 対象シート表示_Click()                      | 
'    If 終了処理_Click() = True Then                      |
'       Call 終了                                |
'    Else                                    |
       With Me.ListBox1                             |
            Application.DisplayStatusBar = True                 |
            Application.StatusBar = "マクロ実行中です…。"            |
            .MultiSelect = fmMultiSelectMulti                  |
            .ListStyle = fmListStyleOption                    |
            .List = Split(WshNames)                       |
        End With                                          |
'    End If                                   |
 End Sub                                     |                                                               | 
'広報用シート編集処理1                                   |
 Private Sub 広報用シート編集_Click()                      |
     Dim lastRow As Long                                  |      
     Dim i As Integer                                     |
     Dim isFirstProc As Boolean                           |
     ThisWorkbook.Sheets("広報用").Cells.ClearContents               |
     With Me.ListBox1                                     |  
         For i = 0 To .ListCount - 1                      |
             If .Selected(i) Then                         |
                 If Not isFirstProc Then                    |
                     isFirstProc = True                     |
                          ThisWorkbook.Sheets("広報用").Range("A1:K1").Value _|
                        = ThisWorkbook.Sheets(.List(i)).Range("A1:K1").Value |
                 End If                                   |
                 Call 広報用シート編集処理2(.List(i))             |
             End If                                       |
         Next i                                           |
     End With                                             |
  End Sub---------------------------------------------------------------------- 
'広報用シート編集処理2
 Sub 広報用シート編集処理2(SheetNameToProc As String)
    Dim i&, j&, n&, S$, No$
    Dim Su&, v, w
       v = ThisWorkbook.Sheets(SheetNameToProc).Cells(1, 1).CurrentRegion.Value
       ReDim w(2 To UBound(v) * 2, 1 To 11) '展開用配列準備
'       For i = 1 To 11
'          w(1, i) = v(1, i)
'       Next
       No = v(2, 1): n = 1
       For i = 2 To UBound(v)
          n = n + 1
          If v(i, 1) = No Then
             Su = Su + 1
          Else
             w(n, 11) = Su & " 件": Su = 1: No = v(i, 1)
             n = n + 1
          End If
          For j = 1 To 11
             w(n, j) = v(i, j)
          Next
       Next
       n = n + 1
       w(n, 11) = Su & " 件"
       n = n + 1
'       w(n, 10) = "合計": w(n, 11) = (UBound(v) - 1) & " 件"
       With ThisWorkbook.Sheets("広報用")
             .Cells(Rows.Count, "J").End(xlUp).EntireRow.Cells(1, 1).Offset(1, 0).Resize(n, 11).Value = w
       End With
  End Sub
'広報用シート編集処理3
 Private Function WshNames()
     Dim ws As Worksheet
     Dim strWshName As String
     For Each ws In ThisWorkbook.Worksheets
         Select Case ws.Name
             Case "運用について", "1.運用の流れ", _
                  "2.配布名簿データーシートの書式統一", _
                  "作成手順", "メニュー", "広報用"
                 'do nothing
             Case Else
                 strWshName = strWshName & " " & ws.Name
         End Select
     Next
     WshNames = Trim(strWshName)
 End Function
'広報用データシート保存処理
 Private Sub 保存_clic()
     Sheets("広報用").Select
     Sheets("広報用(写)").Copy
ウッシ様以外の方でも、こういう方法があるよ♪等、良い方法がありましたらアドバイスいただけると
大変ありがたいので、よろしくお願い致します。(ととろ)

 こんにちは

 >w(n, 10) = "合計"
 は「合計」という文字をセットしているだけで、10列目つまりJ列の最終行を判定する
 ためにセットされていたのでは?
 これをセットせずにJ列で最終行を判定すると、せっかくセットした件数が次のシート
 のデータで上書きされます。

 集計案については、結局レスした内容は的外れだったのかな?
 結果はどうなったのかな。

 現時点のコードがまともに動いてないなら、最初から作り直した方がいいですね。
 このコードのどこがダメなのか回答者側で検証して直すのは手間ですし。

 あとは、inputbox を使用している部分だけ直せばいいのかな?
 「転記すべきデータシートが抜けていたり」という現象はまだ続いているのかな?

 (ウッシ)

こんにちは

ウッシ様、最初のフォローを実施し、只今検証中です。

こんにちは

 >w(n, 10) = "合計"
 > は「合計」という文字をセットしているだけで、10列目つまりJ列の最終行を判定する
 > ためにセットされていたのでは?
 > これをセットせずにJ列で最終行を判定すると、せっかくセットした件数が次のシート
 >のデータで上書きされます。
 →ウッシ様のおっしゃる通りでした。(汗)
  →とても見やすくて素敵な結果を見て検証しています。 

 >集計案については、結局レスした内容は的外れだったのかな?
 >結果はどうなったのかな。
 →検証中ですが、「完璧です!!」全て検証が終ったら、ウッシ様のコードを深読みして
  今後のVBAスキルアップに役立たせていただきますm(_ _)m

 >現時点のコードがまともに動いてないなら、最初から作り直した方がいいですね。
 >このコードのどこがダメなのか回答者側で検証して直すのは手間ですし。
  →途中経過ですが、とても素敵に完璧に動いてい状況です。(*^_^*)ゞ

 >あとは、inputbox を使用している部分だけ直せばいいのかな?
  → はい、何か良い方法がありましたら、アドバイスお願い致します。

 >「転記すべきデータシートが抜けていたり」という現象はまだ続いているのかな?
 → 検証中ですが、完璧な状態であります。検証が終わりましたら、ご報告いたします。

(ととろ)


ウッシ様 お待たせいたしました

検証が完了いたしました。

試験の方法としては、8部門分のシート(8シート)全て選択して処理を行いました。
結果、件数表示及び転記内容は問題なく処理されておりました。

件数の未表示や、転記元のシートの抜けはございませんでした。

本当に、ありがとうございましたm(_ _)m

残りは、inputboxに変るものの方法と、保存ボタンの機能だけになりました。
是非、アドバイスを頂けるとありがたいです。

よろしくお願い致します。(ととろ)


 こんにちは

 InputBox ではなくて、ListBox 使っているのですよね?

 どうして変更したいのですか?

 保存ボタンの機能は
「保存_clic」をコピーし別名にして、"広報用"を"配布名簿"に変更し保存名を年月日時間を
 ファイル名として使える形に フォーマットしてつけてあげるように変更すればいいですよ。

 (ウッシ)

>こんにちは
>InputBox ではなくて、ListBox 使っているのですよね?
 →はい、おっしゃる通りです。
>どうして変更したいのですか?
 →単体(1シート毎に)選択も出来て、一括(全選択)処理が出来る様にしたいです。
 ただ、前提条件としてデータシート1から順番に転記したいので、この考えは無駄でしょうか?
>保存ボタンの機能は
>「保存_clic」をコピーし別名にして、"広報用"を"配布名簿"に変更し保存名を年月日時間を
>ファイル名として使える形に フォーマットしてつけてあげるように変更すればいいですよ。

下記のコードで試みてるのですが、動かなくてなんでかなぁ〜って感じです(汗)
Sub 保存()

 Worksheets(Worksheets.Count).Select
 If ActiveSheet.Name = "メニュー" Then
    Worksheets(Worksheets.Count + 1).Select
 End If
 If ws.Name <> "メニュー" Then
    ws.Select (False)
 End If
 Next
 ActiveWindow.SelectedSheets.Copy
 Application.Dialogs(xlDialogSaveAs).Show
End Sub

コーディングが間違ってるから動かないのは当たり前ですよね(苦笑)
(ととろ)


 こんばんは

 今ListBoxで動いているならそれでいいと思いますけど、単体(1シート毎に)で実行するか
 一括(全選択)処理するか関係無く選択したシートを処理するようにするだけでも良ければ
 単純化出来ますよね。

 また、一括(全選択)処理というのがそのブックのメニューシート以外の全シートの事であればもっと単純に
 メッセージボックスで処理分岐するだけでも出来ますよね。

 '広報用シート編集処理1
 Sub 広報用シート編集_Click()
    Dim ws As Worksheet

    ThisWorkbook.Sheets("広報用").Cells.ClearContents

    Select Case MsgBox("選択シートのみ処理の場合「はい」、" & _
                        "一括処理の場合「いいえ」、" & _
                        "処理中止の場合「キャンセル」", vbYesNoCancel)
        Case vbYes
            Call 広報用シート編集処理2(ActiveSheet.Name)
        Case vbNo
            For Each ws In ThisWorkbook.Worksheets
                Select Case ws.Name
                    Case "メニュー" '対象外シートを増やす場合はここに追加
                        'do nothing
                    Case Else
                        Call 広報用シート編集処理2(ws.Name)
                End Select
            Next
        Case vbCancel
            Exit Sub
    End Select

 End Sub
 Sub 保存()
    Dim ws As Worksheet
    Dim wb As Workbook
    Dim f  As Variant
    f = Application.GetSaveAsFilename( _
       fileFilter:="Excel Files (*.xls), *.xls")
    If f = False Then
        Exit Sub
    End If
    Set wb = Workbooks.Add
    For Each ws In ThisWorkbook.Worksheets
        Select Case ws.Name
            Case "メニュー" '対象外シートを増やす場合はここに追加
                'do nothing
            Case Else
                ws.Copy wb.Worksheets(1)
        End Select
    Next
    Application.DisplayAlerts = False
    For Each ws In wb.Worksheets
       If ws.UsedRange.Count = 1 Then
           ws.Delete
       End If
    Next
    Application.DisplayAlerts = True
    wb.SaveAs f, xlNormal
    wb.Close
 End Sub

 こんな感じです。

 (ウッシ)

ウッシ様 おはようございます。

早速のフォローありがとうございました。

完璧に仕上がりました!(T_T)←嬉し泣きです。

手とり足とり、素人同然の私にお付き合い頂き、また、ご教授頂き本当にありがとうございました。
これからも、VBAを精進していきたいと思います。

本当に、ありがとうございましたm(_ _)m

そして、「ウッシ様や、ここに集まられているExcelのSpecialistである皆様方」に、
厚く御礼申し上げますと共に、また、壁にぶち当たったときは、よろしくお願い致します。

皆様、本当にありがとうございました。(ととろ)


ウッシ様
お疲れ様です。

クローズしたのですが、少しだけアドバイスをお願いしたく以下に内容を記載します。

単体処理にて、「実行時エラー'1004'Rangeクラスのメソッドが失敗しました。」
と言うメッセージが出て色々やっては見たのですが、CELLをセットの部分で不具合が出ているのでしょうか?
併せて、メッセージボックスのサイズが、ExcelBookを開く度に小さくなってしまいます。
メッセージボックスのプロパティで色々試してみたのですが、☑が出来なくなったり等、上手くいかないので
何か、「ここをいじればOK♪」的なアドバイスを頂けたらありがたいです。

クローズしたのに申し訳御座いませんが、アドバイスいただけたら幸いです。

よろしくお願い致します。(ととろ)

以下、コードです。

 '広報用シート編集処理1
 Sub 広報用シート編集_Click()
    Dim ws As Worksheet

    ThisWorkbook.Sheets("広報用").Cells.ClearContents

    Select Case MsgBox("選択シートのみ処理の場合「はい」、" & _
                        "一括処理の場合「いいえ」、" & _
                        "処理中止の場合「キャンセル」", vbYesNoCancel)
        Case vbYes
            Call 広報用シート編集処理2(ActiveSheet.Name)
        Case vbNo
            For Each ws In ThisWorkbook.Worksheets
                Select Case ws.Name
                    Case "運用について" '対象外シートを増やす場合はここに追加
                    Case "1.運用の流れ"
                    Case "2.書式統一"
                    Case "操作説明"
                    Case "メニュー"
                    Case Else
                        Call 広報用シート編集処理2(ws.Name)
                End Select
            Next
        Case vbCancel
            Exit Sub
    End Select
 End Sub
'広報用シート編集処理1←この箇所は修正前のコードです。こちらにすると単体でも動きます。
' Private Sub 広報用シート編集_Click()
'     Dim lastRow As Long
'     Dim i As Integer
'     Dim isFirstProc As Boolean
'     ThisWorkbook.Sheets("広報用").Cells.ClearContents
'     With Me.ListBox1
'         For i = 0 To .ListCount - 1
'             If .Selected(i) Then
'                 If Not isFirstProc Then
'                     isFirstProc = True
'                          ThisWorkbook.Sheets("広報用").Range("A1:K1").Value _
'                        = ThisWorkbook.Sheets(.List(i)).Range("A1:K1").Value
'                 End If
'                 Call 広報用シート編集処理2(.List(i))
'             End If
'         Next i
'     End With
'  End Sub
'広報用シート編集処理2
 Sub 広報用シート編集処理2(SheetNameToProc As String)
    Dim r As Range
    Dim t As Range
    Dim s As Range

    Application.DisplayAlerts = False
    With ThisWorkbook.Sheets(SheetNameToProc)
        .Cells(1, 1).CurrentRegion.Subtotal _--------------------------------
            GroupBy:=1, Function:=xlCount, TotalList:=Array(11), _          |←個々の箇所が黄色
            Replace:=True, PageBreaks:=False, SummaryBelowData:=True---------で反転して止まりま
                                                                             す。      
            Set t = .Cells(1, 1).CurrentRegion.Offset(1)

        Set r = ThisWorkbook.Sheets("広報用").Cells(Rows.Count, "J").End(xlUp).EntireRow.Cells(2, 1)

        r.Resize(t.Rows.Count - 2, t.Columns.Count).Value = t.Value

        On Error Resume Next
        For Each s In r.Offset(, 1).Resize(t.Rows.Count - 2, 1).SpecialCells(xlCellTypeBlanks).Cells
            s.EntireRow.Cells(1, 1).ClearContents
            With s.EntireRow.Cells(1, t.Columns.Count)
                .Offset(, -1).Value = "合計"
                .Value = .Value & "件"
            End With
        Next
        On Error GoTo 0
        .UsedRange.RemoveSubtotal
    End With
    Application.DisplayAlerts = True
 End Sub

(ととろ) 2013/10/18(金) 18:44


 こんばんは

 エラーになった時にデバッグした状態で、SheetNameToProcにマウスポインタを合わせて
 内容を確認して下さい。

 マクロを終了してから、そのシートを開いて手作業で集計が出来るか確認して下さい。

 「実行時エラー'1004'Rangeクラスのメソッドが失敗しました。」 というエラーが再現出来ない
 のでなんとも言えないですが、シートのデータの状態によってエラーになる可能性は有ります。

 また、修正前のコードで動くという事は、SheetNameToProcにセットしているシート名が違う
 という可能性も有ります。

 こちらではととろさんの環境が無いので確認することは出来ないのでエラーになった場合は
 ご自分で調べるスキルを身に付けて下さい。

 >メッセージボックスのサイズが、ExcelBookを開く度に小さくなってしまいます。
 全くなんの事か分かりません。
 エラーメッセージの事では無いですよね?

(ウッシ) 2013/10/18(金) 21:01


ウッシ様 おはようございます。

早速のフォローありがとうございます。

エラーになった時にデバッグした状態で、SheetNameToProcにマウスポインタを合わせて 内容を確認して下さい。 マクロを終了してから、そのシートを開いて手作業で集計が出来るか確認して下さい。 「実行時エラー'1004'Rangeクラスのメソッドが失敗しました。」 というエラーが再現出来ない のでなんとも言えないですが、シートのデータの状態によってエラーになる可能性は有ります。 また、修正前のコードで動くという事は、SheetNameToProcにセットしているシート名が違う という可能性も有ります。 こちらではととろさんの環境が無いので確認することは出来ないのでエラーになった場合は ご自分で調べるスキルを身に付けて下さい。
 → がんばります(^_^)ゞ

メッセージボックスのサイズが、ExcelBookを開く度に小さくなってしまいます。 全くなんの事か分かりません。

エラーメッセージの事では無いですよね?  →対象シートを表示するリストボックスでした。
  間違えてしまいました。すみません。(^_^;)

(ととろ) 2013/10/19(土) 09:23


コメント返信:

[ 一覧(最新更新順) ]


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