Excel VBA質問箱 IV

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

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


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

【17627】列にある文字データを文字別に数えるには... いちご 04/9/3(金) 17:18 質問[未読]
【17634】Re:列にある文字データを文字別に数えるに... ichinose 04/9/3(金) 19:37 発言[未読]
【17640】Re:列にある文字データを文字別に数えるに... ichinose 04/9/3(金) 20:23 発言[未読]
【17704】Re:列にある文字データを文字別に数えるに... Jaka 04/9/6(月) 9:09 回答[未読]
【17706】Re:列にある文字データを文字別に数えるに... いちご 04/9/6(月) 9:16 お礼[未読]
【17710】Re:列にある文字データを文字別に数えるに... ichinose 04/9/6(月) 12:03 発言[未読]
【17716】VBA、超初心者です。ゴメンなさい・・・ いちご 04/9/6(月) 13:47 質問[未読]
【17729】Re:VBA、超初心者です。ゴメンなさい・・・ ichinose 04/9/6(月) 17:57 回答[未読]

【17627】列にある文字データを文字別に数えるには...
質問  いちご  - 04/9/3(金) 17:18 -

引用なし
パスワード
   エクセルの1列に”A","B","C","SC"という全角のアルファベットが並んでいます。
A
C
C
SC
(実際はめっちゃ沢山有り、現状はCOUNTIFで1つ1つ範囲指定して数えています)
同じファイルの別シートに表を作成してAは1、Bは0、Cは2、SCは1
というふうにマクロで表示させたいのですが
どうしたらよいでしょう?
毎日する作業なので、どうぞ知恵をお貸しください。

【17634】Re:列にある文字データを文字別に数える...
発言  ichinose  - 04/9/3(金) 19:37 -

引用なし
パスワード
   ▼いちご さん:
こんばんは。

>エクセルの1列に”A","B","C","SC"という全角のアルファベットが並んでいます。
>A
>C
>C
>SC
>(実際はめっちゃ沢山有り、現状はCOUNTIFで1つ1つ範囲指定して数えています)
>同じファイルの別シートに表を作成してAは1、Bは0、Cは2、SCは1
>というふうにマクロで表示させたいのですが
>どうしたらよいでしょう?
>毎日する作業なので、どうぞ知恵をお貸しください。

例題のようなデータがアクティブシートのA列(A1からデータがあります)にあったとしましょう。
以下のコードは、アクティブシートの次のシート(右側のシート)のA1から下行に
数えるデータ、B1から下行にカウントを表示します。

'========================================================
Sub test()
  Dim rd As Range
  Dim ans As Range
  Set rd = Range("a1", Cells(Rows.Count, 1).End(xlUp))
  With rd.Offset(0, 1)
    .Formula = "=IF(COUNTIF($A$1:A1,A1)>1,"""",A1)"
    .Value = .Value
    Set ans = .SpecialCells(xlCellTypeConstants)
    ans.Copy Worksheets(2).Range("a1")
    .Value = ""
   End With
  With ActiveSheet.Next
   With .Range(.Cells(1, 2), .Cells(ans.Count, 2))
     .Formula = "=countif(" & rd.Address(, , , True) _
          & ",a1)"
     End With
   End With
End Sub

列が違う場合は、数式を変更して下さい。
データ列に項目名をつければ、フィルタが使えます。
コードは、そっちの方が簡単かも・・・。

【17640】Re:列にある文字データを文字別に数える...
発言  ichinose  - 04/9/3(金) 20:23 -

引用なし
パスワード
   ▼ichinose さん:
>
>例題のようなデータがアクティブシートのA列(A1からデータがあります)にあったとしましょう。
>以下のコードは、アクティブシートの次のシート(右側のシート)のA1から下行に
>数えるデータ、B1から下行にカウントを表示します。
>
>'========================================================
>Sub test()
>  Dim rd As Range
>  Dim ans As Range
>  Set rd = Range("a1", Cells(Rows.Count, 1).End(xlUp))
>  With rd.Offset(0, 1)
>    .Formula = "=IF(COUNTIF($A$1:A1,A1)>1,"""",A1)"
>    .Value = .Value
>    Set ans = .SpecialCells(xlCellTypeConstants)
>    ans.Copy Worksheets(2).Range("a1")
>    .Value = ""
>   End With
>  With ActiveSheet.Next
>   With .Range(.Cells(1, 2), .Cells(ans.Count, 2))
>     .Formula = "=countif(" & rd.Address(, , , True) _
>          & ",a1)"
>     End With
>   End With
>End Sub
>
>列が違う場合は、数式を変更して下さい。
>データ列に項目名をつければ、フィルタが使えます。
>コードは、そっちの方が簡単かも・・・。

尚、上記コードはアクティブシートのB列を作業列として使っています。
作業列は、どこでもよいですから、適当に変更して下さい。

【17704】Re:列にある文字データを文字別に数える...
回答  Jaka  - 04/9/6(月) 9:09 -

引用なし
パスワード
   ichinoseさん こんにちは。

書いてきちゃったので乗っけときます
結局は、COUNTIFの関数を入れているだけですけど...。

Sub いちご()
  Dim LsAR As Long, Cer As Long
  LsAR = Range("A65536").End(xlUp).Row
  Range("A1:A" & LsAR).AdvancedFilter Action:=xlFilterInPlace, Unique:=True
  CAE = Range("A1").End(xlDown).Row
  ActiveSheet.Range("A1:A" & CAE).SpecialCells(xlCellTypeVisible).Copy
  Sheets("Sheet4").Range("A1").PasteSpecial (xlPasteValues)
  ActiveSheet.ShowAllData
  S4Er = Sheets("Sheet4").Range("A65536").End(xlUp).Row
  Sheets("Sheet4").Range("B1:B" & S4Er).Formula = "=COUNTIF(Sheet3!A1:A" & CAE & ",A1)"
End Sub

【17706】Re:列にある文字データを文字別に数える...
お礼  いちご  - 04/9/6(月) 9:16 -

引用なし
パスワード
   すごい!ichinose さんありがとうございました
早速、仕事で使わせていただきます
ただ、これをアレンジしないと仕事には使えないんです・・・
日ごとに集計があり
すでに作っている表(横並びの)に表示したいのです
A B C SC の下に日毎の計をだしたいのです。
また分からない事でてきたら、
ご指導のほうよろしくお願い致します(v_v)>""

こんな感じ
  A B C SC
1日 0 2 8 0
2日 1 0 9 0
3日 0 0 0 10

【17710】Re:列にある文字データを文字別に数える...
発言  ichinose  - 04/9/6(月) 12:03 -

引用なし
パスワード
   ▼いちご さん、Jakaさん、こんにちは。

いちご さん
>ただ、これをアレンジしないと仕事には使えないんです・・・
>日ごとに集計があり
>すでに作っている表(横並びの)に表示したいのです
>A B C SC の下に日毎の計をだしたいのです。
>こんな感じ
>  A B C SC
>1日 0 2 8 0
>2日 1 0 9 0
>3日 0 0 0 10
次回からは、
この出力データの形式や入力データの形式をはっきり記述して下さいね!!

コードを記述する回答者は、これらを見て、「規則性がどうなっているか」とか、
入力データ形式や出力データ形式からプロシジャー構造及び、アルゴリスズムを考えます。

今回の場合、出力データの並びは、何となくわかりました。
数えたい項目は、A、B、C、SC等と固定されていると言う事ですね?
これが分かれば、重複データの抽出処理は要りませんね!!

では、入力データは??
上記の出力形式で1日、2日、3日は、何を見れば判断できるのですか?

日毎にシートを変えているのですか?

それとも同一シート上で列を変えているのですか?

この辺りの入力データの情報がわかると
回答がつくと思いますが・・・。

【17716】VBA、超初心者です。ゴメンなさい・・・
質問  いちご  - 04/9/6(月) 13:47 -

引用なし
パスワード
   ごめんなさいichinoseさん
エクセルのファイルに元データシート、日集計シート、1ヶ月分日別集計シート等が有
1ヶ月日別集計のシートのVBAを知りたかったんです
データは番号と日付で管理されています
このデータはロータス123をフロッピーに落とし
エクセルにマクロで貼り付けて作業しています
何分、前任者がVBAばりばり出来たみたいで(もう、いてませんが)
無知な私にはまったくもってわかりません
知ってる関数SUMとかRANGEならわかるんですが。。。
元データシートはこんな感じです
月 日 管理番号・(略)・ 配合・・(略) 
09 01 2000       C
09 01 2001       C
09 01 2002       C
09 01 2003       C
09 02 2004       B
09 02 2005       C

1ヶ月日別シートは月初めの管理番号と月を入力すると
  管理番号個数 ・・・A B C SC 配合計 
1日  4        0 0  4  0   4
2日  
3日
と並んでいる日付行どこでもクリックしてマクロ起動すると
クリックした行の日付の日計集計が1行でてきます
沢山のデータがあり、足してるだけのものや小数点のものやらいろいろあります
マクロがものすごく長く多いので何処をいらっていいのか分からないのが現状です
同じような、計算式が並んでたりすると
同じような式を入れればよいというのがわかりますが

日集計シートは管理番号を入れると
上の1日の場合  管理番号2000 月 09 ←マクロで月、日は表示
         管理番号2003 日 01
その間のデータの集計ができます
それはA4サイズ目一杯データがあり
日別にだしたり、月別に1枚で集計するときに
使います

【17729】Re:VBA、超初心者です。ゴメンなさい・・...
回答  ichinose  - 04/9/6(月) 17:57 -

引用なし
パスワード
   ▼いちご さん:
こんにちは。
以下のご説明でだいたいわかりました。

>エクセルのファイルに元データシート、日集計シート、1ヶ月分日別集計シート等が有
>1ヶ月日別集計のシートのVBAを知りたかったんです
>データは番号と日付で管理されています
>このデータはロータス123をフロッピーに落とし
>エクセルにマクロで貼り付けて作業しています
>何分、前任者がVBAばりばり出来たみたいで(もう、いてませんが)
>無知な私にはまったくもってわかりません
>知ってる関数SUMとかRANGEならわかるんですが。。。
>元データシートはこんな感じです
元データシート(以下のデータが入っているシート名とします)は、
実際には、管理番号と配合の間に色んなデータが入っているということですね?

>月 日 管理番号・(略)・ 配合・・(略) 
>09 01 2000       C
>09 01 2001       C
>09 01 2002       C
>09 01 2003       C
>09 02 2004       B
>09 02 2005       C
今回は、この元データシートはA列が月、B列が日、C列が管理番号、D列が配合とします。シート名は「元データシート」とします。

手順としては、新規ブックに上記のデータを例として、元データシートに作成して下さい。


次に別のシートをアクティブにして、以下のコードを実行して下さい。

'====================================================================
Sub アクティブシートを1ヶ月分日別集計シートにする()
  With ActiveSheet
   .Name = "1ヶ月分日別集計シート"
   .Range("a:a").NumberFormatLocal = "##日"
   .Range("b1:g1").Value = Array("管理番号個数", "A", "B", "C", "SC", "配合計")
   Range("a2").Value = 1
   Range("a2").AutoFill Destination:=Range("A2:A32"), Type:=xlFillSeries
   End With
End Sub

アクティブシートを「1ヶ月分日別集計シート」として、作成します。
ここで、確認していただくのは「1日」、「2日」・・・のセルの書式です。
このセルを数式内で使用しますから、数値として認識してくれる書式にしました。


次に集計したい日のセルを選択してして以下のコードを実行して下さい。

'==================================================================
Sub 行の日付の日計集計()
  Dim rw As Long
  Dim rng As Range
  Dim wk As String
  Dim calad As String
  rw = ActiveCell.Row
  With Worksheets("元データシート")
   Set rng = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
   '↑元データのデータ範囲をA列を基準に取得する
   If rng.Row = 1 Then '元データシートにデータが無い
    MsgBox "データなし"
    calad = ""
    end
   Else
    calad = rng.Offset(0, 1).Address(, , xlR1C1, True)
    End If
   End With
  With Worksheets("1ヶ月分日別集計シート")
   wk = rng.Offset(0, 2).Address(, , xlR1C1, True)
   .Cells(rw, 2).FormulaArray = "=SUM(IF(FREQUENCY(IF(" & calad & "=r" & rw & "c1," & wk & ",0),IF(" & _
                   calad & "=r" & rw & "c1," & wk & ",0))>0,1,0))-IF(SUM(IF(" & _
                   calad & "<>r" & rw & "c1,1,0))>0,1,0)"
'   ↑管理番号個数の計算(重複を個数に入れない計算をしています)
   wk = rng.Offset(0, 3).Address(, , xlR1C1, True)
   .Range(.Cells(rw, 3), .Cells(rw, 6)).Formula = "=SUMPRODUCT((" & calad & "=r" & rw & "c1)*(" & _
                           wk & "=r1c))"
'   ↑各項目(A,B,C,SC)の個数の計算
   .Cells(rw, 7).Value = "=sum(c" & rw & ":f" & rw & ")"
'    ↑配合合計
   End With
End Sub

「1ヶ月分日別集計シート」の集計結果は、全て数式ですから、数式と各セルの関係を
整理してみて下さい。

実際の運用時にセルの位置が変わった場合、コードをどのように変更すればよいか
は、数式とコードを良く見比べて下さい。

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