[[20060530224438]] 『文字の一致合計』(pp) ページの最後に飛ぶ

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

 

『文字の一致合計』(pp)

初心者ですのでよろしくお願いします。たとえば下記のようなデータあり

  A        B         C

1 日本      日本        2

2 アメリカ    アメリカ      2

3 日本      ドイツ       1

4 アメリカ

5 ドイツ

このような文字が5万位入っているものを(バラバラな文字が多数)ありフィルタをか
けて1つずつ検索して数を合計するのが大変なのでB1に名前C1にA列にあった個数を表示させる式などあればと思い質問しました。
よろしくお願いします。


 ご質問の事例は、統合が利用できますので、全文検索でキーワードに
 統合
 として検索しますと、同様のご質問がたくさんご覧になれます。
 B列の列を挿入し、A列を複写し、C1を選択し、データ、統合として、計算の方法には、   
 データの個数を選択し、実行されれば、よろしいようにお見受けします。 (LOOKUP)



VBAなら、ちょうど練習に作る適当な例題のようなテーマですね。(なお)

 考え方を少し
 A列の上から順に、まずそのセルの値(仮にX1とします)をB列の上から比較します。
そして、B列の中になければ、B列の末尾にX1を記載してから、A列の上から順に
セル内容を順に比較し、X1と同じであれば自分で設けたカウンタの数値を+1増加
させます。A列の末尾まで調べてカウンタの合計を、B列のX1を記載した隣のC列に
記載します。
 これを、A列の上から順に繰り返せば出来上がります。
 当然、上記の作業をVBAの式で作りあげることになります。
  ポイントはFOR  NEXT文などを使い繰り返すことと セルをCells(R,C)で表示
してR,やCの値を変化させてセルの値を調査していくということです。
  適当な教科書の例題のようなテーマですが、どなたか作ってみられますか?。

 もう一つポイント
 行の末尾(行番号)を調べる式も大切ですね。
 lastrow = Cells(Rows.Count, 1).End(xlUp).Row
    これは、1列目(A列)の末尾の行番号を調べる式です。1を、2,3にすれば
  B,C列の末尾を知ることが出来ます。つまりlastrowにその数値が入ります。


 なおさんの方法だと、少なくとも2回はループしないといけませんね?(5万行!x?回?)
 それより、LOOKUPさんの方法をコードにした方がすっきりしているし、
 高速処理できると思いますが?
 いつも思いますが、LOOKUPさんの処理方法は早いと思います。
 (seiya)

速さは考えていませんが,最近はCPUが早いので
どのくらいの時間で処理できるか,興味深いですね。
 簡単なマクロを実行するだけで処理が済むので
便利とは思いますが。
  確認のため作ってみましょうか。まっててください。
(なお) 

 その方法だと、配列を使用しない限り実用性は無いでしょう。
 (seiya)

作ってみました。わずか,10行程度の簡単なコードで可能でした。

(処理時間は??)

一応数10個のデータで試したら結果が瞬時に

でました。5万個のデータでどの位時間がかかるかどなたか
試して,結果(時間)を聞かせてください。

 「実用性が無い」か,今後データ処理・集計に便利で活用できるか
 確認したいですね。(なお)

Sub 一致合計集積()

lastrow1 = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To lastrow1

n = 0

lastrow2 = Cells(Rows.Count, 2).End(xlUp).Row

   For J = 1 To lastrow2

     If Cells(i, 1) = Cells(J, 2) Then

     GoTo 100

       End If

      Next

   For k = i To lastrow1

      If Cells(i, 1) = Cells(k, 1) Then

          n = n + 1

          End If

    Next

  Cells(lastrow2 + 1, 2) = Cells(i, 1)
  Cells(lastrow2 + 1, 3) = n

100:
Next

End Sub


A,B,C,Dという簡単な文字(ほとんどAで,他は数個)を5万行程度
A列に記載して,試験した結果,数分で終了しました。
 データの文字数や種類数にもよりますが,ちょっと休憩している
間に終了するかもしれません。 何時間も待つことはないでしょう。
 他の皆さんの,処理結果はどうでしょうか?。
 (なお)

 なおさん、以下のデータで実行してみてください。
 数分かかる処理は、すでに実用性が無いと思いますが?

 sub datainput()
 with range("a1:b50000")
   .formula="=round(rand()*100,0)
   .value=.value
 end with
 end sub
 (seiya)

 試してはいませんが、なおさんのコードの処理時間はデータ数にも比例するでしょうが
 種類(ユニークなデータ数)にも比例しますね。
 最大はデータ数5万、5万種類。
 まして、セルに何万回も直接アクセスしているので重いでしょう。

 私は統合をよく知らないので別の方法を取るとしたら
 A列をフィルタオプションで重複を落とし可視セルをB列にコピペ。
 C列にはCOUNTIFの式を入れる。
 (やっちん)


 私も統合は良くわからないので、ピボットテーブルかな・・・。

 (川野鮎太郎)

このデータは,A列とB列に入りましたので
B列は削除して実施しました。正確には時間測定しませんが
既に終了しました。10分以下ですかね。
  但し,0のデータを集積していないようなので
数値の場合は多少動きがおかしいですね。

  このソフトは,データの周類を自分でB列にリスト
アップします。

 配列とDictionary object の併用です。
 かかっても、数秒でしょう。
 sub test()
 dim dic as object,a,e,n
 set dic=createobject("Scripting.Dictionary")
 dic.comparemode=vbtextcompare
 a=range("a1",range("a" & rows.count).end(xlup)).value
 redim result(1 to ubound(a,1), 1 to 2)
 for each e in a
    if not dic.exists(e) then
      n=n+1
      result(n,1)=e:result(n,2)=1
      dic.add e,n
    else
     result(dic(e),2)=result(dic(e),2) + 1
    end if
 next
 range("b1").resize(n,2)=result
 set dic=nothing:erase a,result
 end sub
 (seiya)

(seiya)さん
非常に早くアッという間に終了です。
 やはり,マクロでも早く処理できるんですね。
  コードの内容が高級??過ぎてよく理解出来ていませんが
 配列やDictionary object(なんんだかわかっていませんが)を使うと
早いんですね。
  私のはタダVBAで,かんたんな基本的な作業でこつことと処理して
いくだけですから遅いですよね。VBAの入門練習程度のつもりと思ってください。 


 それでも、LOOKUPさんの処理速度には、及ばないと思います(想像ですが)
 Excel本来の機能が一番早いような気がします。
 (seiya)

 別の方法として、
 A列にフィルターオプション(Advancedfilter)でユニーク値を抽出
 その後、B列に=countif(a:a,a1) と数式を一気に入れてやれば、これも速いでしょう。
 (seiya)
 追記:やっちんさんが既にご提案されてましたね。失礼しました。

 sub test()
 range("a1:a" & range("a" & rows.count).end(xlup).row).advancedfilter _
 action:=xlfiltercopy,copytorange:=range("b1"),unique:=true
 range("b1:b" & range("b" & rows.count).end(xlup).row).offset(,1).formular1c1= _
 "=countif(c[-2],rc[-1])"
 range("c:c").value=range("c:c").value
 range("b1:c1").delete shift:=xlup
 end sub
 こんなんですよね?
 (ROUGE)※seiyaさん風にしてみました〜♪

 ROUGEさん
 まったくその通りです。
 寸分の違いも有りません。
 速いでしょ?
 (seiya)

 そんなに大量のデータを処理したことは、ありませんので、テストしてみました。

 A1に="ABC"&RANDBETWEEN(1,100)として作成した5万個では、目測で、約10秒、
 ="ABC"&RANDBETWEEN(1,1000)として作成した5万個では、約1分掛かりました。
 連続して5万件の統合元範囲を設定しますと、私のPCでは、終了しませんでした。
 並び替えをしてから実行しますと、40秒程度になりました。

 B列にA列を複製した後、C1を選択して、データ、統合として、
 集計の方法にデータの個数、統合元範囲には、10000個ずつ別けて、
 Sheet1!$A$1:$B$10000
 Sheet1!$A$10001:$B$20000
 Sheet1!$A$20001:$B$30000
 Sheet1!$A$30001:$B$40000
 Sheet1!$A$40001:$B$50000
 とそれぞれ、追加して登録し、統合の基準に左端列をチェックし、OK。

 論理を書いて処理するものは、並び替えをしてから実行するようなものも、
 よいのかもしれません。                      (LOOKUP)

 統合にはある種の制約があるのかもしれませんね?
 しかし、私個人としては、普段Filter/AdvancedFilter/PivotTable
 等、便利な機能を使用していないので、(主な理由は、"Header"です)
 LOOKUPさんの的を得た見事な処理には、いつも感心させられています。
 (seiya)


 衝突しました。
 ピボットテーブルでやってみました。
 データはseiyaさんの書かれたコードで作成したもので試しました。
 
Sub Pivot1()
MyTimer = Timer
Const MyData As String = "内容"
With Worksheets("Sheet1")
    If Range("A1").Value <> MyData Then
        Rows("1:1").Insert Shift:=xlDown
        Range("A1").Value = MyData
    End If
    LastRange = Range("A65536").End(xlUp).Address(0, 0)
    ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, _
                                   SourceData:="Sheet1!A1:" & LastRange).CreatePivotTable _
                                   TableDestination:=.Range("E1"), _
                                   TableName:="ピボットテーブル1"
    With .PivotTables("ピボットテーブル1").PivotFields(MyData)
        .Orientation = xlRowField
        .Orientation = xlDataField
        .Position = 1
    End With
    On Error Resume Next
    .PivotTables("ピボットテーブル1").PivotFields("合計 : " & MyData).Function = _
        xlCount
End With
MyTimer = Timer - MyTimer
MsgBox Format(MyTimer, "#,##0.00") & "秒 抽出完了"
End Sub

 (川野鮎太郎)

 川野鮎太郎さん
 PTはレコードのカウントが出来るのですよね?
 これも速そう...何とか習得しないと...
 (seiya)

 実情を伴なわない過分なお言葉を頂戴しました。大変恥ずかしいです。
 しかし、統合は、手操作で集計するときは、大変便利ですが、内部処理は、遅いでしょう? (LOOKUP)

 >内部処理は、遅いでしょう?
 そのようですね。
 ですが、大事なところは、「手作業で出来る」ということではないでしょうか?
 Loop は手作業では出来ませんし(死ぬ気でやれば可能かも?)
 (seiya)


(seiya)さんのtest文は1秒程度,(ROUGE)さんのコードも1秒程度ですが
若干,(seiya)のtest文の方が早く感じました。
 いづれも,1秒程度ですので,技術的(コードの作成)な興味を除いては
大同小異というところでしょうか。
 元々の作業は「フィルタをかけて1つずつ検索して数を合計するのが大変なので」
 対策を求めていたわけですね。多分,5万個のデータを処理するに,数時間あるいは
あるいはもっと時間をかけていたのではないでしょうか。
  それが,1秒か,2秒かを論ずることにどれだけの価値があるでしょうか。もちろん
速さをテーマにした場合はその目的に向って,0.1秒でも早いことに価値があるで
しょうが,数時間の時間(想像ですが)を使っていたのに,数分に短縮されただけで
は「数分かかる処理は、すでに実用性が無い」ということでしょうか。
   昔は,プログラムを走られせて,処理が終了するまで,一服したり,他の仕事をやったりして,気長に待ったものですが。
   難しいコードや,特殊なコマンドを持ち出して処理するのもいいでしょうが
最も初歩的・基本的な FOR  NEXT 文やIF文などだけで,セルを一つづつ処理することは
EXCELのVBAの基本思います。難しいコードを持ち出さなくても,時間はかかりますが,処理が出来るということが,私はVBA活用の一歩と思っています。
このような処理方法は通常,excelのデータを処理する場合の基本的な物となりますので,色々応用していけば,大抵の処理をこのような簡単なコードのみでも可能になります。

   余計な蛇足でしたが,一言でした。


 私のコードもループしていますが?

 vbaでの処理は常にいくつかの手段が存在すると思います。
 それは即ち、vbaの知識以前のExcelの知識の問題だと思います。
 初歩的な処理、一般的な処理、高度な処理等あると思いますが、
 「最適な処理」を目指すのが良いのでは?
 (seiya)

初歩的な処理、一般的な処理、高度な処理等あると思いますが、 「最適な処理」を目指すのが良いのでは?

ユーザにも,初歩・一般ユーザ・高度なユーザがあると思います
ので,「最適な処理」を紹介しても,処理自身は最適処理であっても
本人(質問者など:別にここでレベルが低いと言っているのではありません。)が
そのレベル相当かどうかということもありますね。

  単に,達人のコードをコピーして機能を達成すればそれでいいというわけでは
ないと思います。自分で内容を理解して,今後改造・変更していける範疇でないと
回答の意味がうすいのではないでしょうか。(なお)


 もちろん回答の第一目的は、質問者の問題を解決することにあります。
 しかしながら、他の方々も勉強しているのです。
 私のコードのご批評も歓迎いたします。
 「学校」ですよね?
 (seiya)

 質問者さん側の考え方によるのでは?と私は思います。
「こうしたいけど思いつかない…そうだ学校で聞いてみよう!」となり、何らかの
回答を頂き、結果うまくいった。それで終わりの方もいらっしゃるだろうし、
そこから、勉強していかれる方もいるだろうし…。
いろんな回答者さまと回答があって、その中で質問者さんのお好みの方法で解決すればいいことですし、
解決された後は、回答者さまが「ちょっといじってこんな風にしてみました。」みたいのが
あってもよいのでは?と思います。
私もたくさん勉強させて頂いておりますが、そんな学校が大好きです。
余計な一言でした。
(やなせ)

 おっ、おもろいスレ、見っけ(笑
 これなぁ、基本的にはなおさんのお考えに賛成ですけど、やっぱし10分対数秒
 では誰もが後者の方に魅力を感じますわなぁ。

 ところでDictinaryですけど、これを使うたから処理が高速になるとは限りまへん
 ねんで、えぇ。

 まぁ、色んなデータで試してみたらお分かりでっしゃろけど、変数だけで処理した方が
 平均的に(これは私が経験した実体験によるデータデス)処理速度は増します。
 要するに変数で吸い込んで一気に吐き出す作業が作業の高速化を生みまんねん。
 ただ、このDictinaryっちゅうやつはなかなかの手練れモンで、変数だけでは処理が
 複雑になる(つまり頭を悩まさなくてはならない)作業でも簡単にやってくれるん
 ですワ。

 なおさんもいっぺん試してみたらどうでっか?
 Dictionaryのトリコになりまっせ、キッと(笑

 あ、呑んでええ加減なこと喋っとったらアカン(笑
    Mr.LOOKUPが一番や〜!(オマリー風に)
    わたしももっと(やせな)(笑(弥太郎)


 そういうことですよ。
 だから、Loop させる場合には配列とDictionary objectがこの件に関して
 一番効率のよい組み合わせと判断したまでです。
 私個人的には、やっちんさんご提案の方法が好きですけど。
 (seiya)

 seiyaさんご賛同ありがとうございます。

 今度はループで直接セルを扱うバージョンです。
 処理の考え方の一つとしての提示です。
 ソートして、違うものが出てくるたびに件数を出力します。
 さらに配列で処理したり描画を止めれば少しは早くなるでしょう。
 0件の場合の処理はしてません。

 Sub Test()
    Dim LastRow As Long
    Dim i As Long
    Dim y As Long
    Dim Cnt As Long
    Dim St As String

    LastRow = Range("A" & Rows.Count).End(xlUp).Row

    Range("A1:A" & LastRow).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlStroke, DataOption1:=xlSortNormal

    St = Cells(1, 1).Value
    i = 1
    Cnt = 0
    Do While i <= LastRow
        Do While St = Cells(i, 1).Value And i <= LastRow
            i = i + 1
            Cnt = Cnt + 1
        Loop
        y = y + 1
        Cells(y, 2).Value = St
        Cells(y, 3).Value = Cnt
        St = Cells(i, 1).Value
        Cnt = 0
    Loop
 End Sub
 (やっちん)

 そうですね、
 これですと、ループは一度ですみますのでかなり速くなると思います。
 50000行ですからね。
 ただ、ソートしてしまうと質問者の希望に即した結果とは完全には一致しなくなりますね?
 (seiya)

 件数を出すための考え方だけということで(^^;
 (やっちん)

 やっちんさんのコードに、配列変数であらかじめA列のデータを取り込んで、
 最後にA列に貼り付けてあげれば、質問者の希望に即した結果になりますね。
 (ROUGE)

 なるほど^^
 元のデータをあまり触りたくないと思ってる私にはなかなか出てこない考え方ですね。
 でも今回はソーート(^^;
 今回のコードは質問者のppさんへというよりは、なおさんに同じループでもこんなのありますよ〜
 ということでの提示でした。
 (やっちん)


 ROUGEさんのおっしゃっている意味がよく理解できないのですが、
 A列を配列に入れておいて、処理が終わったら戻す、ということでしたら
 ソートしたデータにループする事は同じですから、出力の順番が変わる可能性がありますよね?
 もし、行データまで配列に格納して、出力の際に順番通り取り出すのでしたら、
 ややこしいコードが必要になると思いますが?
 はずしていますか?
 このようなことは、あまり気にならないと思いますが...
 (seiya)

みなさんありがとうございました。(川野鮎太郎)さんの式でB1とC1に何と入れればよろしいのでしょうか??すみません教えて下さい。


 ppさん、
 LOOKUPさんの解決方法以外は、全てマクロです。
 どれでもお好きなコードをコピーして

 1) Alt + F11 を押してVB Editorを起動
 2) [挿入]->[標準モジュール]で、右空白部分にペースト
 3) x をクリックしてVB Editorを閉じ、エクセルに戻る
 4) [ツール]->[マクロ]->[マクロ] マクロ名を選択して[実行]
 (seiya)
 p.s. 私の書いた"Sub datainput()"はだめですよ。

 出現順を加味すると・・・
 B列に行番号を書き込む。
 A列からB列をA列、B列をキーに昇順でソート。
 カウント中に名称毎に最初に出現したときの行番号を保持。
 件数書き込み時にその行番号も出力。(C列:名称,D列:件数,E列:行番号)
 A列からB列をB列をキーに昇順でソート。
 C列からE列をE列をキーに昇順でソート。
 E列を削除。
 B列を削除。

 多少面倒に。 
 (やっちん)

 > 出力の際に順番通り取り出す
それは考慮していませんでした^^;
seiyaさんのサンプルデータが数字だったので、ソートされていたほうが見やすかったんです・・・。
(ROUGE)

 もういらないでしょうけどね。せっかく作ったので、、、
Sub てすと()
Dim MyDic As Object
Dim MyA As Variant
Dim x As Variant
Dim y As Variant
Dim i As Long
Dim MyTimer As Single
MyTimer = Timer
Set MyDic = CreateObject("Scripting.Dictionary")
    With Sheets("Sheet1")
        MyA = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)).Value
        For i = 1 To UBound(MyA, 1)
            MyDic(MyA(i, 1)) = MyDic(MyA(i, 1)) + 1
        Next
        x = MyDic.Keys
        y = MyDic.Items
        ReDim MyAry(LBound(x) To UBound(x), 1 To 2)
        For i = LBound(x) To UBound(x)
            MyAry(i, 1) = x(i)
            MyAry(i, 2) = y(i)
        Next
        .Range("C1").Resize(UBound(MyAry, 1) + 1, 2).Value = MyAry
    End With
Set MyDic = Nothing
Erase MyAry, MyA, x, y
MyTimer = Timer - MyTimer
MsgBox Format(MyTimer, "#,##0.00") & "秒 抽出完了"
End Sub
(SoulMan)

みて見ると,色々なコード・やり方がありますね。そのコートを整理すると

 1)高級な(一般的で用的なものより難しい・高度な)
     (ここでは配列とDictionary objectを使うような)テクニックを
     取り入れて行う方法

 2)元々EXCELで用意されている内部メニュ(ソートや関数)を
     マクロに応用する方法

 3) 単純な汎用VBAコードを使い,目的の作業をセル操作の
       処理みで一歩づつ処理達成させるもの。

  一番,いい例は,よくプロブラミングの授業や勉強で出てくるテーマで
  多数の数値から,最大値,最小値を求める基本的な課題がりますね。
    この場合,MAX関数や,MIN関数を使ってもとめれば,数行で結果を
  得ることが出来ますね。
   別の方法として,数値を順番に取り込んで,それまでの数値の最大値
 最小値と 比較して最後に残った数値を結果とする原点から考えて最大値
を求める方法がありますね。
  結果だけを求めるのであれば,前者が早く効率的です,しかし,自分の
 やりたいことをコードで表現して色々な場面に応じた応用力を養うには
  後者の思考も大切と思います。
    私がプログラミングの先生なら,前者85点,後者100点ですね。(おせっかいもの)


 同感です。
 それ以後のレスにも:

 大同小異-    別に早さを云々してはいないのです。なおさんの方法より効率が良いということです。

 今後改良.... - 簡単?なコードがより容易に改良できるとは限りません。非常に抽象的な言い方で、読まれる方に誤解される危険性があります。

 それに、Excelの学校であると言うことは、プログラムの学校では無いでしょう?
 この部分も、あとで削除します。
 P.S.
 おせっかいものさん、
 以上の見地に立って、私は
 前者に100点
 後者は0点です
 (seiya)


以下にひとこと。

「「「以下のご掲載は、質問者に対する回答ではなく、先輩の回答者の皆さんに
対する発言になっています。」」」

  VBAなら、ちょうど練習に作る適当な例題のようなテーマですね。(なお)

 考え方を少し
 A列の上から順に、まずそのセルの値(仮にX1とします)をB列の上から比較します。
 そして、B列の中になければ、B列の末尾にX1を記載してから、A列の上から順に
 セル内容を順に比較し、X1と同じであれば自分で設けたカウンタの数値を+1増加
 させます。A列の末尾まで調べてカウンタの合計を、B列のX1を記載した隣のC列に
 記載します。
 これを、A列の上から順に繰り返せば出来上がります。
 当然、上記の作業をVBAの式で作りあげることになります。
  ポイントはFOR  NEXT文などを使い繰り返すことと セルをCells(R,C)で表示
 してR,やCの値を変化させてセルの値を調査していくということです。
 適当な教科書の例題のようなテーマですが、どなたか作ってみられますか?。

 もう一つポイント
 行の末尾(行番号)を調べる式も大切ですね。
 lastrow = Cells(Rows.Count, 1).End(xlUp).Row
    これは、1列目(A列)の末尾の行番号を調べる式です。1を、2,3にすれば
  B,C列の末尾を知ることが出来ます。つまりlastrowにその数値が入ります。

  """"" 上記にコメントします(なお)"""""""""""""

 上記のわたしのレスは質問者に対するものとして記載しました。質問者のやりたい
ことは,VBAを使って処理するには適当な内容で,VBAで作るにはいい内容であると
いうことです。質問者に対してその作り方・考え方を述べたもので,
「先輩の回答者の皆さんに」を対象にしているものでもありません。
 最も,質問者のレベル自身わかりませんがら,何回も言っている高級な難しい処理を
披露しても,それはただの結果が効率よく得られると言うことだけでは,どこかの
専門業者に作ってもらうことと同じことではないでしょうか。
  自分で,処理の手順を考えて,コードを組立ていくことを,学んでいくことで
複雑な,予め用意されている関数や,メニュを使わなくても(探さなくても)
処理する力が付いてくるということです。知識としてこのメニュ・このコードを
知っていることも大切ですが,同じことを簡易な汎用コードを利用して,頭で考えて
1歩から作っていくことが大切でもあります。特に勉強しようと考えている人には。
   先ほどの最大値・最小値の算出に於いても,既存の関数。メニュを抜きにして
自分でコードを組立てて算出すること知る(勉強する)ことが,プログラム(VBA)
の思考過程には必要ということです。(seiya)さんの評価は0点ということですか。
皆さんもそのような課題をやったことはありませんでしょうか。


 50000行のデータですよ?
 一般論を言っているのではありません。
 (seiya)

(なお)です。
今,読み返していて気になったので,補足です。

 「「「適当な教科書の例題のようなテーマですが、どなたか作ってみられますか?。」」」

 この一言を持って,(LOOKUP) さんが上記の意見をされてのかもしれないと思いまし
たので,補足です。

  上記の操作をVBAで作れば,処理は可能(速さはともかく)ですから,コード化
 するにはある程度VBAの経験は必要ですので,質問者のレベルがわかりませんので
 質問者自分でコード化できるかどうかの心配もあります。
  私自身も,自分で当初,自分で時間をかけて作って(サンプルとして)見せると
いうほどの元気もありませんので,時間と興味の有る方がおられれば,どうでしょうか
 という意味で上記の言葉を記載しております。
   それは,後で述べた最大値・最小値の算出の場合と同じで,どこかの便利なツール
  を利用して早さを競うということではなく,自分でデータ・セルを一つ一つ処理
 していくことで「教科書の例題のようなテーマ」と述べていたのです。
    皆さんの,腕比べを誘ったわけではありません。

 ここに居られる諸先生方がなおさんの仰る、VBAの基本とやらを知らずに
 投稿されているとお思いですか?

 50000行なんですよ。
 腕比べと捕らえるのは、貧弱な発想ですね。
 (seiya)

 >適当な教科書の例題のようなテーマですが、どなたか作ってみられますか?。
 が、質問者に向けた言葉とは到底受け止めて貰えんのんちゃいまっか?
 それも質問者が所望もしていないVBAをですよ。
 仮にその御方がVBAを相当こなす御方やったらどう申し開きします?

 質問者に対するもんやとおっしゃいますが
 >質問者のレベルがわかりません 
 のんやったら尚更そういう発言は控えるべきやと思いまんねんけど、どうでっしゃろ?

 残念ながら文面以外になおさんの真意が伝わってきまへんワ(笑
       (弥太郎)

 充分議論(でもないか(笑))されたことやし
 皆さん、もうここら当たりでそろそろおひらきにしまへんか?
    (弥太郎)

 あら?ほなっ。が消えてる〜(笑
     (弥太郎)


「「やはり、回答者に対しておっしゃっているのですね。」」

 そういう意味では,「質問者に」にサンプルを作ってみせれば質問者にとっては
 参考になるということで,回答者にも呼びかけてはいますが,主題は質問者の
 質問に質問者に答えるということであって,質問者に対してがまず第一です。
   回答者には2次的に呼びかけたというところでしょうか。

「「「VBAの基本とやらを知らずに

 投稿されているとお思いですか?」」」

  技術的・知識的には,基本どころか,すでに披露されているような,難しいこと
まで知っておられ,達人が多いと思っています。
   一方で,その知識・技術を追求するあまり,基本をうまく活用して,簡単な
 コードを使いまわし,原点から処理をするということを軽んじている人もいる
ように思います。
   プログラム(VBAを含む)を業務や仕事にするプロであれば,効率,処理時間など
は最大の課題でしょうが,EXCELをシートにマクロ(VBA)をちょっと組み込んで,
簡単な処理をやらせる程度なら,汎用の幼稚な処理でも,十分使えることが多いのです。
その程度のことで十分と思っている人もいるでしょうし,VBAなんか知らなくても
いいと思っているひともいるでしょから,突然,難しい諸先生方しか理解できない
ようなテクニックを持ち出しても,適当かどうかということです。
   前にも言いましたが,処理が遅ければ,待てばいいじゃないですか。待つ時間に別の
ことを考えるのもいいですよ。 もちろん,プロや業者がそうではいけないでしょうが
 ,自分で使うものを自分で作るのであれば,それでいいと私は思っています。
 当然,徐々に知識を増やし,自分のレベルを上げるのも大切ですが,それぞれ段階
があります。


 それ即ち、50000行のデータに対する適切な処理方法がわからないということですね?
 あれこれ言う前に、もっと勉強しましょう。
 (seiya)

>もっと勉強しましょう。

汎用の幼稚な処理でも,十分使えることが多いのです。
その程度のことで十分と思っている人もいるでしょうし,VBAなんか知らなくても
いいと思っているひともいるでしょから

  それぞれの人の考えがあるものです。そこまで勉強しなくていいと思って
いる人もいるでしょう。「ほどほど」という言葉もあります。


 同感ですね!
 でも、「ほどほど」の方は、回答するのも「ほどほど」にしてほしいものです。
 (seiya)


 もうそろそろ終わっても良いかなと思います(^_^A;
 そもそも今回の質問は50000行ものデータがある。
 それを簡単に出来る式はないでしょうか。 とのことでした。
 それに対して、エクセル一般機能で備わっている『統合』をLOOKUPさんがご提示されていました。

 恐らく、お試しになれば、一発で解決できる問題です。
 操作が不慣れであっても1〜2分で抽出できるでしょう。

 私も提案したピボットテーブルも同様に一般機能です。
 単にピボットテーブルの操作をVBAに直しただけが私の書いたコードです。

 時間の競い合いや、技術のひけらかしでも何でも無いですよ。

 seiyaさんや、やっちんさんの言っておられるのも、今回のご質問(50000行のデータ)に関しては、
 単にループ処理させるより、一般機能で出来るものは利用するのも効果的です。
 ってことだと思います。(当初はそのような文面に思いました。)

 私もVBAが得意ってことは無いので、For Next や For Eachでループ処理させるのは
 頻繁に使います。
 ただ、処理する内容によって(データの数等)他に方法が無いかと考えるのも
 上達するためのひとつの手段だし、大切だと考えます。

 ってことで、皆さんが意義を感じておられるのは、50000行ものデータを処理するのに、
 単純なループ処理が、『適当な教科書の例題のようなテーマ』だと思わないってことなんじゃないかな・・・。(^_^A;

 (川野鮎太郎)

 衝突しちゃいましたが・・・
 
 ず〜と、眺めてたのですが、、、
 一回だけ、レス付けさせていただいて。。。
 
 >VBAの基本とやらを知らずに投稿されているとお思いですか?
 え〜、、、 悲しいかな、何が基本で何が知識・技術かわかってないσ(^o^;)です。。。
 
 さて私は、前にも言いましたがこの学校で「エクセル」の全てを学んできました。
 (私の知っていることの意味です)
 この学校は素晴らしいですよ〜♪
 だって、ただ(笑い)で勉強できて、色々な考え方・手法があることをボランティアで
 教えてくれるんですもの〜
 エクセルを始めて、ほぼ2年になります。
 この学校で、関数やマクロを勉強させていただきました。
 実務でも使用できるようになりました。
 やっと、エクセル君と少しだけ仲良くなれた気がします。
 
 何が言いたいかというと、、、
 ここは学校です。色々な意見があってもいいと思いますが、
 ようは、どうやって勉強するかだと思います。
 なおさんの仰る通り、質問者のレベルに合わせて(レベルがわかればですが・・・)
 回答を導き出すのも良いでしょう。
 こんな方法もあるよ。と教えるのもいいでしょう。
 だって、過去ログを検索しここにきた人にとっては、その方が質問者ですから。
 
 ココで色々なことを勉強するのは、自分でもあり、あなたでもあるのです
 わからなければ、また質問すればいいじゃないですか〜
 だってここは、学校ですもの☆
 
 まぁ、色々な人が色々な考えで勉強していると言うことですよ。きっと。
 
 (キリキ)(〃⌒o⌒)b

 質問者が所望もしていないVBAを書く人はたくさんいるでしょ?
 心当たり有りませんか?

 あれこれ言う前に、もっと勉強しましょう。
 って、すごい言葉です。
 ご自分はどんな人なんでしょ?  (jun53)

コメント返信:

[ 一覧(最新更新順) ]


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