Excel VBA質問箱 IV

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

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


8328 / 13644 ツリー ←次へ | 前へ→

【20151】改ページの数を数えたいのですが・・・ barbar 04/11/29(月) 19:40 質問[未読]
【20155】Re:改ページの数を数えたいのですが・・・ ちゃっぴ 04/11/29(月) 23:18 回答[未読]
【20187】Re:改ページの数を数えたいのですが・・・ barbar 04/11/30(火) 18:14 お礼[未読]
【33831】Re:改ページの数を数えたいのですが・・・ こんばんは 06/1/21(土) 19:11 発言[未読]
【33832】Re:改ページの数を数えたいのですが・・・ ichinose 06/1/21(土) 20:15 発言[未読]
【33836】Re:改ページの数を数えたいのですが・・・ こんばんは 06/1/21(土) 23:31 発言[未読]
【33841】Re:改ページの数を数えたいのですが・・・ ichinose 06/1/22(日) 7:04 発言[未読]
【33842】Re:改ページの数を数えたいのですが・・・ こんばんは 06/1/22(日) 9:31 発言[未読]
【33871】Re:改ページの数を数えたいのですが・・・ ichinose 06/1/23(月) 7:22 発言[未読]
【33921】Re:改ページの数を数えたいのですが・・・ こんばんは 06/1/23(月) 19:53 発言[未読]
【33940】Re:改ページの数を数えたいのですが・・・ ichinose 06/1/24(火) 8:05 発言[未読]
【33997】Re:改ページの数を数えたいのですが・・・ はじめまして 06/1/24(火) 19:10 発言[未読]
【34001】Re:改ページの数を数えたいのですが・・・ ichinose 06/1/24(火) 19:34 発言[未読]

【20151】改ページの数を数えたいのですが・・・
質問  barbar  - 04/11/29(月) 19:40 -

引用なし
パスワード
   VBでexcelのマクロを使って改ページ数を数えたいのですが

H_Break = MWK_NewSheet.HPageBreaks.Count

とすると改ページの直前のセルまで出力した場合
2カウントされてしまいます。(?_?)
わかる方いらっしゃったら教えてください。
お願い致します。m(_ _)m

【20155】Re:改ページの数を数えたいのですが・・・
回答  ちゃっぴ  - 04/11/29(月) 23:18 -

引用なし
パスワード
   ▼barbar さん:
>VBでexcelのマクロを使って改ページ数を数えたいのですが

HPageBreaks, VPageBreaksは非常に厄介なPropertyです。
(というよりも、Excelの印刷関連すべてに言えますが・・・)

Bookによっては、正常に取得できたり、できなかったりします。

ただ、その対象SheetをActiveにし、表示を改ページPreviewにして
改ページの最後のセルをActiveにすると正常に取得できる場合が
多いようです。

ご参考までに・・・

【20187】Re:改ページの数を数えたいのですが・・・
お礼  barbar  - 04/11/30(火) 18:14 -

引用なし
パスワード
   ▼ちゃっぴ さん:
>▼barbar さん:
ありがとうございました。

【33831】Re:改ページの数を数えたいのですが・・・
発言  こんばんは  - 06/1/21(土) 19:11 -

引用なし
パスワード
   この
H_Break = MWK_NewSheet.HPageBreaks.Count
を利用し
1book内のsheet枚数を
countする事も出来るのでしょうか?
その場合
Dim H_break As ・・・?何を使ったら良いのでしょうか?

【33832】Re:改ページの数を数えたいのですが・・・
発言  ichinose  - 06/1/21(土) 20:15 -

引用なし
パスワード
   こんばんは。

>この
>H_Break = MWK_NewSheet.HPageBreaks.Count
>を利用し
>1book内のsheet枚数を
>countする事も出来るのでしょうか
シートの数が知りたいのなら、

  MsgBox Workbooks("book1").Sheets.Count

            ↑ブック名

で取得出来ます。


>その場合
>Dim H_break As ・・・?何を使ったら良いのでしょうか?

これは要らないと思いますが、

dim H_break as long

【33836】Re:改ページの数を数えたいのですが・・・
発言  こんばんは  - 06/1/21(土) 23:31 -

引用なし
パスワード
   ▼ichinose さん:

こんばんは。ありがとうございます
Do Until mySh.Cells(i, 1).Value = ""
        Set myCell = .Columns(1).Find(mySh.Cells(i, 1).Value)
        If myCell Is Nothing Then
          .Range("A" & j & ":" & "I" & j).Value = mySh.Range("A" & i & ":" & "I" & i).Value
            .Cells(j, 8).Value = mySh.Name
          j = j + 1
        Else
          If InStr(1, .Cells(myCell.Row, 8).Value, mySh.Name) = 0 Then
            .Cells(myCell.Row, 8).Value = .Cells(myCell.Row, 8).Value & " & " & mySh.Name
          End If
        End If
        i = i + 1
       
         Workbooks("book1").Sheets.Count = i - 1

        .Cells(myCell.Row, 8).Value = .Cells(myCell.Row, 8).Value & " & " & mySh.Name = Dir()
      Loop
でsheet枚数分の情報が8列目に"sheet名"&"sheet名"と取得していきます
それを全sheet枚数分揃った場合その8列目に出る情報をclearにしたいのですが
Workbooks("book1").Sheets.Count = i - 1でエラーが起こり
.Cells(myCell.Row, 8).Value = .Cells(myCell.Row, 8).Value & " & " & mySh.Name = Dir()

上記だと全sheet内情報が消えてしまうのですが
その列:行だけを対象にする為にはどこを直すべきでしょうか?
すいません。分かりましたら教えて下さい

【33841】Re:改ページの数を数えたいのですが・・・
発言  ichinose  - 06/1/22(日) 7:04 -

引用なし
パスワード
   おはようございます。
まず、以下のコードだけでは,
やりたいことがわかりません。


何がしたいのかをはっきりと記述してください。

・やりたいことの概要説明
・入力データと出力データの詳細説明と例題

例えば、myshで参照しているシートの
A列に何が入っているか

.Cells(myCell.Row, 8).Value このセルには
何が結果としていれたいのか(コードを見る限りは、True Or Falseですが)

>
で、コードを見て気が付いたところは

>Do Until mySh.Cells(i, 1).Value = ""
>        Set myCell = .Columns(1).Find(mySh.Cells(i, 1).Value)
>        If myCell Is Nothing Then
>          .Range("A" & j & ":" & "I" & j).Value = mySh.Range("A" & i & ":" & "I" & i).Value
>            .Cells(j, 8).Value = mySh.Name
>          j = j + 1
>        Else
>          If InStr(1, .Cells(myCell.Row, 8).Value, mySh.Name) = 0 Then
>            .Cells(myCell.Row, 8).Value = .Cells(myCell.Row, 8).Value & " & " & mySh.Name
>          End If
>        End If
>        i = i + 1
>       

>         Workbooks("book1").Sheets.Count = i - 1
'        ↑このコードを何をしたくて記述したのでしょうか?
'Workbooks("book1").Sheets.Count は、book1という名前のついたブックの
'シート数を取得するための読取専用のプロパティです。
'このコードのように値を入れることはできません。
         
>
>        .Cells(myCell.Row, 8).Value = .Cells(myCell.Row, 8).Value & " & " & mySh.Name = Dir()
'Dir()を使用していますが、最初にどのように設定しているのですか?
'繰り返しますが、上記のコードでは、.Cells(myCell.Row, 8).Value には
'TrueかFalseしか入りません。それでよいのですか?


>      Loop

>でsheet枚数分の情報が8列目に"sheet名"&"sheet名"と取得していきます
↑これもよくわかりません。

シートにこんな情報が入っていた場合、


↑にここにデータ例を記述。


処理後は、


↑ここに結果として得たいデータ例を記述
してみて下さい。

問題をみている方にわかりやすくする と言う目的ですが、
上記のような説明記述を行うことでご自分の考えも
整理されてくると思いますよ!!.

【33842】Re:改ページの数を数えたいのですが・・・
発言  こんばんは  - 06/1/22(日) 9:31 -

引用なし
パスワード
   ▼ichinose さん:
おはようございます。
>まず、以下のコードだけでは,やりたいことがわかりません。
>何がしたいのかをはっきりと記述してください。

そうですね・・申し訳ないです
やりたいことに対しVBAが良く分からず頭がぐちゃぐちゃになり
申し訳ないです

>・やりたいことの概要説明
>・入力データと出力データの詳細説明と例題
>例えば、myshで参照しているシートの
>A列に何が入っているかシートにこんな情報が入っていた場合、
列A    B:F
1NO(文字列)情報 
2DTQA654FR  AのNoに対しての情報行
>↑にここにデータ例。

同じ状態のファイルをそれぞれ1つのbookに読み込み
ファイル名=sheet名とさせたく
それぞれ処理するsheet(ファイル)枚数は
その都度変わる状態で
列A に対し 同じ状態の情報がある場合(重複データ)
      1sheetにしかない場合
を検査します
それを新bookにて
列Aを基準にB:Fにその情報
列Hに 重複している情報のsheet名を&"を使い抽出
但し 全sheetに情報が揃った場合は 列Hに 上記 &"での
sheet名は出さずにいたい
のでsheet枚数をカウントしその情報を消そうとしています

また sheet1枚のみの情報に関しては
   そのsheetを()内に明細と考えています

>.Cells(myCell.Row, 8).Value このセルには
>何が結果としていれたいのか(コードを見る限りは、True Or Falseですが)
>で、コードを見て気が付いたところは
>
>>Do Until mySh.Cells(i, 1).Value = ""
>>        Set myCell = .Columns(1).Find(mySh.Cells(i, 1).Value)
>>        If myCell Is Nothing Then
>>          .Range("A" & j & ":" & "I" & j).Value = mySh.Range("A" & i & ":" & "I" & i).Value
>>            .Cells(j, 8).Value = mySh.Name
>>          j = j + 1
>>        Else
>>          If InStr(1, .Cells(myCell.Row, 8).Value, mySh.Name) = 0 Then
>>            .Cells(myCell.Row, 8).Value = .Cells(myCell.Row, 8).Value & " & " & mySh.Name
>>          End If
>>        End If
>>        i = i + 1
>>       
>
>>         Workbooks("book1").Sheets.Count = i - 1
>'        ↑このコードを何をしたくて記述したのでしょうか?

  sheet枚数をカウントしたく入れました
  そのカウントで 全sheet枚数が揃った場合と
          1枚のみとの作業に移すつもりで・・

>'Workbooks("book1").Sheets.Count は、book1という名前のついたブックの
>'シート数を取得するための読取専用のプロパティです。
>'このコードのように値を入れることはできません。
        

>>        .Cells(myCell.Row, 8).Value = .Cells(myCell.Row, 8).Value & " & " & mySh.Name = Dir()
>'Dir()を使用していますが、最初にどのように設定しているのですか?

上記は全てのsheetに情報がある場合H列に載せない・・・
としたかったのですが
>
>>      Loop
>
>
>
>処理後は、
 
 列A  B:F   H
 No  情報  sheet名 重複は&と使って明記
        全sheetには明記なし
        (1sheet名) 1つのsheetのみ値がある場合 

>↑ここに結果として得たいデータ例を記述
>してみて下さい。
>
>問題をみている方にわかりやすくする と言う目的ですが、
>上記のような説明記述を行うことでご自分の考えも
>整理されてくると思いますよ!!

本当に面倒をお掛けし申し訳ありません

【33871】Re:改ページの数を数えたいのですが・・・
発言  ichinose  - 06/1/23(月) 7:22 -

引用なし
パスワード
   ▼こんばんは さん:
おはようございます。
まだ、私には、理解できないことがあるのですが・・・。


>>・やりたいことの概要説明
>>・入力データと出力データの詳細説明と例題
>>例えば、myshで参照しているシートの
>>A列に何が入っているかシートにこんな情報が入っていた場合、
> 列A    B:F
>1NO(文字列)情報 
>2DTQA654FR  AのNoに対しての情報行

myshが参照しているシートの概要はわかりました。


>>↑にここにデータ例。
>
>同じ状態のファイルをそれぞれ1つのbookに読み込み
>ファイル名=sheet名とさせたく
↑これがわかりません。


>それぞれ処理するsheet(ファイル)枚数は
>その都度変わる状態で
>列A に対し 同じ状態の情報がある場合(重複データ)
>      1sheetにしかない場合
>を検査します
これもわかりませんが、

コードと照合すると、
myshのA列のNOという情報で
読み込んだブックのA列を検索しているということですか?
この読み込んだブックのA列には、同じNOが複数あることも考えなくてよいのですか?

列A    B:F
1NO(文字列)情報 
2DTQA654FR  AのNoに対しての情報行
3bbb     情報1
4ccc     情報2
5bbb     情報3

というような・・・。


>それを新bookにて
>列Aを基準にB:Fにその情報
>列Hに 重複している情報のsheet名を&"を使い抽出
>但し 全sheetに情報が揃った場合は 列Hに 上記 &"での
>sheet名は出さずにいたい
>のでsheet枚数をカウントしその情報を消そうとしています
これもわかりません。重複しているという具体例を2,3例挙げてください。


>
>また sheet1枚のみの情報に関しては
>   そのsheetを()内に明細と考えています
>
>>.Cells(myCell.Row, 8).Value このセルには
>>何が結果としていれたいのか(コードを見る限りは、True Or Falseですが)
>>で、コードを見て気が付いたところは
>>
>>>Do Until mySh.Cells(i, 1).Value = ""
>>>        Set myCell = .Columns(1).Find(mySh.Cells(i, 1).Value)
>>>        If myCell Is Nothing Then
>>>          .Range("A" & j & ":" & "I" & j).Value = mySh.Range("A" & i & ":" & "I" & i).Value
>>>            .Cells(j, 8).Value = mySh.Name
>>>          j = j + 1
>>>        Else
>>>          If InStr(1, .Cells(myCell.Row, 8).Value, mySh.Name) = 0 Then
>>>            .Cells(myCell.Row, 8).Value = .Cells(myCell.Row, 8).Value & " & " & mySh.Name
>>>          End If
>>>        End If
>>>        i = i + 1
>>>       
>>
>>>         Workbooks("book1").Sheets.Count = i - 1
>>'        ↑このコードを何をしたくて記述したのでしょうか?
>
>  sheet枚数をカウントしたく入れました
>  そのカウントで 全sheet枚数が揃った場合と
>          1枚のみとの作業に移すつもりで・・
>
>>'Workbooks("book1").Sheets.Count は、book1という名前のついたブックの
>>'シート数を取得するための読取専用のプロパティです。
>>'このコードのように値を入れることはできません。
>        
>
>>>        .Cells(myCell.Row, 8).Value = .Cells(myCell.Row, 8).Value & " & " & mySh.Name = Dir()
>>'Dir()を使用していますが、最初にどのように設定しているのですか?
>
>上記は全てのsheetに情報がある場合H列に載せない・・・
>としたかったのですが
>>
>>>      Loop
>>
>>
>>
>>処理後は、
> 
> 列A  B:F   H
> No  情報  sheet名 重複は&と使って明記
>        全sheetには明記なし
>        (1sheet名) 1つのsheetのみ値がある場合 
>

これは、どこに出力するのですか?
読み込んだブックの各シートに出力と言うことですか?


というように未だ私には肝心なところが殆どわかっていません。

【33921】Re:改ページの数を数えたいのですが・・・
発言  こんばんは  - 06/1/23(月) 19:53 -

引用なし
パスワード
   ▼ichinose さん:
>▼こんばんは さん:
>おはようございます。
>まだ、私には、理解できないことがあるのですが・・・。
>
>
>>>・やりたいことの概要説明
重複データとしていないデータの新bookへの抽出です
>>>・入力データと出力データの詳細説明と例題

全てのシート(txt?)保存形式により違いが出ますが
それをEXCELbookに読込んだ際
それぞれのファイル名をsheet名に置換え
幾つかのシートを比較します
その比較対象は列Aとなり
他の列は 列Aそれぞれの行のデータ(情報)が入れられています

それぞれのsheetを比較し重複・単独を違うbookに
書き出そうとしています

読込んだ時点でファイル名をsheet名に置換え重複データの作業し
最終的に どのsheetが 重複しているか 単独かを調べたいのです

>コードと照合すると、
>myshのA列のNOという情報で
>読み込んだブックのA列を検索しているということですか?
>この読み込んだブックのA列には、同じNOが複数あることも考えなくてよいのですか?

上記を調べたく
 比較させたいファイルをbookの読み込み
 そのファイル名をシート名に使い検証

A sheet
> 列A    B:F
>1NO(文字列)情報 
>2DTQA654FR  AのNoに対しての情報行
>3bb      bb情報
>4ccc     ccc情報
>5bbb     bbb情報

B sheet
> 列A    B:F
>1NO(文字列)情報 
>2DTQA654FR  AのNoに対しての情報行
>3bbb     bbb情報
>4cc      cc情報
>5bbb     bbb情報

C sheet
> 列A    B:F
>1NO(文字列)情報 
>2DTQA654FR  AのNoに対しての情報行
>3bbb     bbb情報
>4ccc     ccc情報
>5bb      bb情報


 検証結果(新bookにて)
> 列A    B:F   H
>1NO(見出し)  
>2DTQA654FR  情報行 (全sheetにある為sheet名は出さない)
>3bbb     情報1  〃
>4ccc     情報2  A&C
>5bb      情報3  A&C
>6cc      情報2  (B)


というような結果を求めています
列Aを基準にB:Fにその情報
列Hに 重複している情報のsheet名を&"を使い抽出
但し 全sheetに情報が揃った場合は 列Hに 上記 &"での
sheet名は出さずにいたいのでsheet枚数をカウントしようとしていました

A&B&Cのような全sheet揃った場合は情報を消そうとしています

また sheet1枚のみの情報に関しては
そのsheetを()内に明細と考えています

説明が下手で申し訳御座いません

【33940】Re:改ページの数を数えたいのですが・・・
発言  ichinose  - 06/1/24(火) 8:05 -

引用なし
パスワード
   ▼こんばんは さん:
おはようございます。
何となくわかってきました。


>
>A sheet
>> 列A    B:F
>>1NO(文字列)情報 
>>2DTQA654FR  AのNoに対しての情報行
>>3bb      bb情報
>>4ccc     ccc情報
>>5bbb     bbb情報
>
>B sheet
>> 列A    B:F
>>1NO(文字列)情報 
>>2DTQA654FR  AのNoに対しての情報行
>>3bbb     bbb情報
>>4cc      cc情報
>>5bbb     bbb情報
>
>C sheet
>> 列A    B:F
>>1NO(文字列)情報 
>>2DTQA654FR  AのNoに対しての情報行
>>3bbb     bbb情報
>>4ccc     ccc情報
>>5bb      bb情報
↑この情報を有した入力データとしての
ブックをBook1.xlsとします。

コードをどこに記述するのかが明確になっていませんが、
上記のブックにしましょう。

まず、標準モジュールに
'==================================================
Sub main()
  Dim idx As Long
  Dim ans As Collection
  Dim sht As Worksheet
  Set ans = no_dup(Workbooks("book1.xls")) 'この引数に検査するブックを指定
  Set sht = Workbooks.Add.Worksheets(1)
  sht.Range("a1:h1") = Array("NO", "inf1", "inf2", "inf3", "inf4", "inf5", "", "シート名")
  For idx = 1 To ans.Count
    With ans.Item(idx)
     sht.Range(sht.Cells(idx + 1, 1), sht.Cells(idx + 1, 6)).Value = .infarray
     If .scnt < ThisWorkbook.Sheets.Count Then
       sht.Cells(idx + 1, 8).Value = .shtnm
       End If
     End With
    Next
End Sub
'===================================================================
Function no_dup(bk As Workbook) As Collection
  Dim i_data As Class1
  Dim idx As Long
  Dim rng As Range
  Dim crng As Range
  Dim shnm As String
  Dim sdx As Long
  On Error Resume Next
  Set no_dup = New Collection
  For idx = 1 To bk.Sheets.Count
    With bk.Sheets(idx)
     sdx = idx
     Set rng = .Range("a2", .Cells(.Rows.Count, 1).End(xlUp))
     If rng.Row > 1 Then
       shnm = .Name
       For Each crng In rng
        Set i_data = New Class1
        With i_data
          .infarray = crng.Resize(1, 6).Value
          .shtnm = shnm
          .scnt = 1
          .last_index = idx
          End With
        no_dup.Add i_data, crng.Value
        If Err.Number <> 0 Then
          With no_dup.Item(crng.Value)
           If .last_index <> idx Then
             .shtnm = .shtnm & "&" & shnm
             .scnt = .scnt + 1
             .last_index = idx
             End If
           End With
          End If
        Next
       End If
     End With
    Next
End Function

**********************************
クラスモジュールに(クラス名は class1)
'===========================================
Public infarray As Variant
Public shtnm As String
Public scnt As Long
Public last_index As Long


これでmainを実行してみて下さい。

新規ブックに
>
> 検証結果(新bookにて)
>> 列A    B:F   H
>>1NO(見出し)  
>>2DTQA654FR  情報行 (全sheetにある為sheet名は出さない)
>>3bbb     情報1  〃
>>4ccc     情報2  A&C
>>5bb      情報3  A&C
>>6cc      情報2  (B)
>

と言う結果が作成されます(順序は違いますが)


確認してみて下さい。

【33997】Re:改ページの数を数えたいのですが・・・
発言  はじめまして  - 06/1/24(火) 19:10 -

引用なし
パスワード
   ▼ichinose さん:
有難う御座います!!
早速動かしてみたのですが
インデックスが有効範囲にありません
Set ans = no_dup(Workbooks("book1.xls")) 'この引数に検査するブックを指定
のところで止まるのですが
全て見出しから入っているのですが
何がおかしくて止まってしまうのでしょうか?

配列名はあっていると思うのですが?

それから
申し訳ないのですが
クラスモジュールに(クラス名は class1)
'===========================================
Public infarray As Variant
Public shtnm As String
Public scnt As Long
Public last_index As Long

のクラス名 と言うのは初めて聞きました
どのように使えばよいか教えていただけませんか?

お手数お掛けいたしまして申し訳ありません

【34001】Re:改ページの数を数えたいのですが・・・
発言  ichinose  - 06/1/24(火) 19:34 -

引用なし
パスワード
   ▼はじめまして さん:
こんばんは。


>早速動かしてみたのですが
>インデックスが有効範囲にありません
>Set ans = no_dup(Workbooks("book1.xls")) 'この引数に検査するブックを指定
                 'ブック名は間違いないですか?
このブック名は、重複検査を行うブック名ですよ!!

もし、マクロをこのブックに記述しているのなら

Set ans = no_dup(thisworkbook)

でもよいです。


>のところで止まるのですが
>全て見出しから入っているのですが
>何がおかしくて止まってしまうのでしょうか?


>配列名はあっていると思うのですが?

>それから
>申し訳ないのですが
>クラスモジュールに(クラス名は class1)
>'===========================================
>Public infarray As Variant
>Public shtnm As String
>Public scnt As Long
>Public last_index As Long
>
>のクラス名 と言うのは初めて聞きました
VBEにて「挿入」---「クラスモジュール」で既定で作成されるクラスモジュール名
がClass1です。ここに上記のデータ定義を行なって下さい。


>どのように使えばよいか教えていただけませんか?
本当は、ユーザー定義型変数でよいのですが、
残念なことにコレクションのItemとして使えないので、
クラスを使いました。

クラスというのは、独自のオブジェクトを設計するために使用します。
となると、オブジェクトって何?
ってことになってしまいますね!!

上記コードが動いてから、クラスモジュール
で検索してみて下さい。

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