Excel VBA質問箱 IV

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

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


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

【50922】検索して、足し算をする方法・・・ さくら 07/8/22(水) 14:52 質問[未読]
【50926】Re:検索して、足し算をする方法・・・ ハチ 07/8/22(水) 15:13 回答[未読]
【50929】Re:検索して、足し算をする方法・・・ さくら 07/8/22(水) 16:10 質問[未読]
【50931】Re:検索して、足し算をする方法・・・ neptune 07/8/22(水) 16:54 発言[未読]
【50933】Re:検索して、足し算をする方法・・・ ABC 07/8/22(水) 18:28 発言[未読]
【50952】Re:検索して、足し算をする方法・・・ ハチ 07/8/23(木) 9:39 発言[未読]
【50956】Re:検索して、足し算をする方法・・・ さくら 07/8/23(木) 10:34 質問[未読]
【50959】Re:検索して、足し算をする方法・・・ ABC 07/8/23(木) 11:22 発言[未読]
【50961】Re:検索して、足し算をする方法・・・ neptune 07/8/23(木) 13:45 発言[未読]
【50985】Re:検索して、足し算をする方法・・・ さくら 07/8/24(金) 11:55 お礼[未読]
【50984】Re:検索して、足し算をする方法・・・ ハチ 07/8/24(金) 10:49 発言[未読]
【50988】Re:検索して、足し算をする方法・・・ さくら 07/8/24(金) 13:25 お礼[未読]

【50922】検索して、足し算をする方法・・・
質問  さくら  - 07/8/22(水) 14:52 -

引用なし
パスワード
   はじめまして。
RangeとかSelectionくらいしか知らない状態ではありますが、なんとか
やりたいことをやりたくてVBAを調べています。

そこで質問なのですが、セルの中をtestで検索して、
aaa/    43
aaa/test1  18
aaa/test2  17
というものを探したいと思います。(後ろの数字は適当です)
そのあとで、
aaa/    78 (43、18、17を足したもの)
という一行のセルに変換したいと思います。
(この例では、3行が1行になるようにしたいです)
そして、このaaaというところに、どんな英数字が入っても問題なく
変換できるようにしたいと思っています。

これを実現するには、どういったコードを書けばよいのか、途方にくれています。
ヒントでも構いませんので、なにか足がかりになりそうな情報を教えてはいただけないでしょうか。
今日一日そればかり調べていますが、どうにも検討がつかなくて・・・・
よろしくお願いします。

【50926】Re:検索して、足し算をする方法・・・
回答  ハチ  - 07/8/22(水) 15:13 -

引用なし
パスワード
   ▼さくら さん:
>はじめまして。
>RangeとかSelectionくらいしか知らない状態ではありますが、なんとか
>やりたいことをやりたくてVBAを調べています。
>
>そこで質問なのですが、セルの中をtestで検索して、
>aaa/    43
>aaa/test1  18
>aaa/test2  17
>というものを探したいと思います。(後ろの数字は適当です)
>そのあとで、
>aaa/    78 (43、18、17を足したもの)
>という一行のセルに変換したいと思います。
>(この例では、3行が1行になるようにしたいです)
>そして、このaaaというところに、どんな英数字が入っても問題なく
>変換できるようにしたいと思っています。
>
>これを実現するには、どういったコードを書けばよいのか、途方にくれています。
>ヒントでも構いませんので、なにか足がかりになりそうな情報を教えてはいただけないでしょうか。
>今日一日そればかり調べていますが、どうにも検討がつかなくて・・・・
>よろしくお願いします。

この条件だけなら、関数SUMIFでできませんか?
使い方はヘルプで見てください。

例)A1〜A3にtestを含む文字列があり、B1〜B3に合計する数値がある
=SUMIF(A1:A3,"*/test*",B1:B3)

【50929】Re:検索して、足し算をする方法・・・
質問  さくら  - 07/8/22(水) 16:10 -

引用なし
パスワード
   ハチさん、ありがとうございます。
SUMIFの使い方を見てみました。
私の書き方が悪かったようです。すみません。
aaa、というのは、毎回同じではなく、

aaa/
ccc/
ccc/test1
ddd/
ddd/test1
ddd/test2

といったデータになり、
この場合は、aaa/はそのままで、
tes1とtest2があるccc/とddd/の場合だけ、足し算をして一行にまとめる、というイメージです。

で、他のブックでは、

rrr/
rrr/test1
rrr/test2
ere/
qeg/
ahe/
ahe/test1

といった場合もあったりと、いろいろなのです・・・・

よろしくお願いします。

【50931】Re:検索して、足し算をする方法・・・
発言  neptune  - 07/8/22(水) 16:54 -

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

>これを実現するには、どういったコードを書けばよいのか、途方にくれています。
先ず、コード化を考えずに、頭の中でどうやって判断、計算しているか
を順番に整理して、纏めましょう。

コード化はその後です。

そして、纏めたものをキチンと整理して、書き込んで見ましょう。
そうすれば、沢山のアドバイスをいただけると思います。

プログラムは
・考えを纏める、整理する
・コード化
・検証
なので、一番最初の「考えを纏める、整理する」は自分でやらなくては
他人にはなかなかわからんです。

【50933】Re:検索して、足し算をする方法・・・
発言  ABC  - 07/8/22(水) 18:28 -

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

はじめまして、よこから失礼します。
さて、さくらさんは、ハチさんの書かれた
=SUMIF(A1:A3,"*/test*",B1:B3)を試してみたのでしょうか?
上記の中にある『*』は何にでも置き換えられるという便利なものです。
ですから上記判定は、aaa/test1でもXYZ/test123でも
拾うことができます。
実際に
>aaa/     1
>ccc/     2
>ccc/test1   3
>ddd/     4
>ddd/test1   5
>ddd/test2   6
の条件でも計算できましたよ。(答え14)
一度確認してみて思い通りの機能でなかったなら
再度質問してみたら如何ですか?

>ハチさん、ありがとうございます。
>SUMIFの使い方を見てみました。
>私の書き方が悪かったようです。すみません。
>aaa、というのは、毎回同じではなく、
>
>aaa/
>ccc/
>ccc/test1
>ddd/
>ddd/test1
>ddd/test2
>
>といったデータになり、
>この場合は、aaa/はそのままで、
>tes1とtest2があるccc/とddd/の場合だけ、足し算をして一行にまとめる、というイメージです。
>
>で、他のブックでは、
>
>rrr/
>rrr/test1
>rrr/test2
>ere/
>qeg/
>ahe/
>ahe/test1
>
>といった場合もあったりと、いろいろなのです・・・・
>
>よろしくお願いします。

【50952】Re:検索して、足し算をする方法・・・
発言  ハチ  - 07/8/23(木) 9:39 -

引用なし
パスワード
   ▼さくら さん:
>ハチさん、ありがとうございます。
>SUMIFの使い方を見てみました。
>私の書き方が悪かったようです。すみません。
>aaa、というのは、毎回同じではなく、
>
>aaa/
>ccc/
>ccc/test1
>ddd/
>ddd/test1
>ddd/test2
>
>といったデータになり、
>この場合は、aaa/はそのままで、
>tes1とtest2があるccc/とddd/の場合だけ、足し算をして一行にまとめる、というイメージです。

>aaa/はそのまま
とはどういう意味ですか?
testの文字列がないなら計算の対象外かと思ってSUMIFでは? と提案したのですが、
なんらかの形で、リストに残すのであればまったく話は違ってきますね。

・ccc/ ddd/ ごとに分類しながら、testが含まれる行を加算しながらリスト化していきたい

ということですかねぇ?
ではtestが含まれない行はどうするのか?

neptuneさんも書かれてますが、ロジックを整理することが先決だと思います。

【50956】Re:検索して、足し算をする方法・・・
質問  さくら  - 07/8/23(木) 10:34 -

引用なし
パスワード
   ▼neptuneさん
アドバイス、ありがとうございます。
「考えを纏める、整理する」が先決、ですね。。
自分の頭のなかで考えていることを、きちんとまとめて書き出すということの
訓練をしなくてはいけないと思いました。がんばります。ありがとうございます!

▼ABCさん
=SUMIF(A1:A3,"*/test*",B1:B3)は、試したのですが、自分の考えていたものと、違っていました。testを足し算したいわけでは、ありませんでした。
試したことも書かずに、返信をしてしまい反省しています。。
ありがとうございます!

▼ハチさん
考えをまとめてみました。はじめに、testで検索する、というのそもそもの間違いの元だったみたいです。まとめてみたので、以下に書きます。

実現したいのは、

aaa/        4
aaa/test1    3
aaa/test2    1
ccc/        8
ccc/test1    4
ddd/test1    6
ddd/test2    4
eee/        2
eee/test2    3

というエクセルの表があった場合、

aaa/        8
ccc/        12
ddd/        10
eee/        5

というよう表に書き換えたいということです。
内訳は以下です。

aaa/        8 ←aaa/,aaa/test1,aaa/test2を足したもの
ccc/        12 ←ccc/,ccc/test1を足したもの
ddd/        10 ←ddd/test1,ddd/test2を足したもの
eee/        5 ←eee/,eee/test2を足したもの

-----------
まとめると、
ある文字列1/        数字1
ある文字列1/test1    数字2
ある文字列1/test2    数字3
は、
ある文字列1/        数字1+数字2+数字3
と書き換えます。

test*しかない、
ある文字列2/test1    数字4
ある文字列2/test2    数字5
という場合は、
ある文字列2/        数字4+数字5
と書き換えます。

test*が無い、
ある文字列3/        数字6
という場合は、そのまま
ある文字列3/        数字6
で書き換え(?)ます。

これで、伝わりましたでしょうか。。伝えるのって難しい。
よろしくお願いします!

【50959】Re:検索して、足し算をする方法・・・
発言  ABC  - 07/8/23(木) 11:22 -

引用なし
パスワード
   ▼さくら さん:
SUMIFの検索条件にワイルドカードを使うのを今回覚えたので
SUMIFで作ってみました。
これで出来ますか?
     B         C
2    aaa/        4
3    aaa/test1     3
4    aaa/test2     1
5    ccc/        8
6    ccc/test1     4
7    ddd/test1     6
8    ddd/test2     4
9    eee/        2
10    eee/test2     3
11        
12        
13    aaa/     =SUMIF(B2:B10,B13&"*",C2:C10)   ⇒8
14    ccc/     =SUMIF(B2:B10,B14&"*",C2:C10)   ⇒12
15    ddd/     =SUMIF(B2:B10,B15&"*",C2:C10)   ⇒10
16    eee/     =SUMIF(B2:B10,B16&"*",C2:C10)   ⇒5

>実現したいのは、
>
>aaa/        4
>aaa/test1    3
>aaa/test2    1
>ccc/        8
>ccc/test1    4
>ddd/test1    6
>ddd/test2    4
>eee/        2
>eee/test2    3
>
>というエクセルの表があった場合、
>
>aaa/        8
>ccc/        12
>ddd/        10
>eee/        5
>
>というよう表に書き換えたいということです。
>内訳は以下です。
>
>aaa/        8 ←aaa/,aaa/test1,aaa/test2を足したもの
>ccc/        12 ←ccc/,ccc/test1を足したもの
>ddd/        10 ←ddd/test1,ddd/test2を足したもの
>eee/        5 ←eee/,eee/test2を足したもの
>
>-----------
>まとめると、
>ある文字列1/        数字1
>ある文字列1/test1    数字2
>ある文字列1/test2    数字3
>は、
>ある文字列1/        数字1+数字2+数字3
>と書き換えます。
>
>test*しかない、
>ある文字列2/test1    数字4
>ある文字列2/test2    数字5
>という場合は、
>ある文字列2/        数字4+数字5
>と書き換えます。
>
>test*が無い、
>ある文字列3/        数字6
>という場合は、そのまま
>ある文字列3/        数字6
>で書き換え(?)ます。
>
>これで、伝わりましたでしょうか。。伝えるのって難しい。
>よろしくお願いします!

【50961】Re:検索して、足し算をする方法・・・
発言  neptune  - 07/8/23(木) 13:45 -

引用なし
パスワード
   ▼さくら さん:
こんにちは

がんばってますね。^ ^

逆質問や、お説教じみたことばかり書いて申し訳ないですが、
サンプルデータには
>test*しかない、
>ある文字列2/test1    数字4
>ある文字列2/test2    数字5
>という場合は、
>ある文字列2/        数字4+数字5
>と書き換えます。
に該当するデータがないのではないでしょうか?

>これで、伝わりましたでしょうか。。伝えるのって難しい。
本当にそう思います。

で、本題ですが、やりたいことはある程度まとまったようですが、
今度はどのように処理していくかが問題です。
この点も考えなければなりません。ExcelVBAはExcelの機能を自動化する
ために存在します。従って、Excelの一般操作で出来ることは全て出来る
ようになっています。(多分^ ^;)

 その他、VBAはvisual basicという開発言語のサブセットですから
それ自体でプログラムを組むことも出来ます。

今度はどのように処理していくかですが、いきなり高度なことを書かれても
理解できません。私は初心者のころそうでした。

ですから、先ずはExcelの一般機能でならどうやるか、一般機能で
出来ない部分はどのような処理かを考えるために
>今度はどのように処理していくか
が非常に大事になってきます。

ものすごく簡単に書くと
1.全ての「ある文字列、test*、test*が無い」を取り出す
2.それぞれの「ある文字列」を含むデータを抽出する
3.計算する→転記
のような感じになると思いますが、
特に1、2、はものすごく沢山の方法が考えられます。
ご自分ではどの方法が好みか検討してください。

※意地悪を言っているわけではありません。自分で考えてやらなければ
すぐ動くコードをもらっても、後で、改造、改良をしようと思っても
出来ず、又ここで修正を請う事になります。時々そのような人が
いますが、それはもはや質問ではなく掲示板のルールを完全無視でしょ? 
そういう事を避ける為です。

例え、遅くても冗長でもそれが我慢できる程度で、自分の理解の内にある
コードを書くことが大事と思います。
マクロは目的を達成する手段ですからね。

あっ、先に書いておきますが、私はサンプルは書いてもそのまま
使えるようなコードは書かないスタンスを取っておりますので悪しからず。

他の方のアドバイスも参考になさってください。

【50984】Re:検索して、足し算をする方法・・・
発言  ハチ  - 07/8/24(金) 10:49 -

引用なし
パスワード
   ▼さくら さん:
やりたいことはだいたい解りました。

/test* という文字列は関係なく
文字列n/ の分類して集計したいということですね?

このデータには「項目行」はあるのでしょうか?
あるのなら、関数と基本機能だけでもできそうです。
無いのなら・・・
項目行を追加するか
ループさせて分類ごとに加算していくかですね。
(このあたりは、ご自分の理解できる範囲のものを使うほうが良いです)

1
関数であれば、A2から取り出すとすると
=LEFT($A2,FIND("/",$A2)) 
これで 文字列/ の部分だけ取り出せます。
この数式を最終行までFillする。
2
数値データの部分と取り出した文字列の部分で、ピボットテーブルを作成
フィールドの設定を"合計"にすれば望みのリストになるのでは?

別案としては・・・
案2
取り出した文字列をフィルタオプションで重複を除去
ABCさんの書かれているSUMIFで集計

といったところでしょうか?

【50985】Re:検索して、足し算をする方法・・・
お礼  さくら  - 07/8/24(金) 11:55 -

引用なし
パスワード
   ▼ABC さん:
ワイルドカード、というのは、「*」のことなんですね。。
SUMIFで、やりたいことはできそうなのですが、aaa〜eeeが規則的ではないため
少し手間になりそうなので、違う方法を考えたいと思います。
でも、これでやりたいことへ一歩進みました!ありがとうございます。

▼neptune さん:
アドバイスありがとうございます。意地悪だなんてとんでもないです。。。
どこから手をつけていいか分からない状態だったので、
進め方、みたいなものを教えていただけて、感謝感激です。

サンプルデータに不備がありました。ご指摘ありがとうございます。
今一度、サンプルデータを書き直しました。

元データ
aaa/    4
aaa/test1  3
aaa/test2  1
bbb/    6
ccc/    8
ccc/test1  4
ddd/test1  6
ddd/test2  4
eee/    2
eee/test2  3

出したい結果
aaa/    8
bbb/    6
ccc/    12
ddd/    10
eee/    5

そこで、自分なりにどう処理するかをまとめてみました。

パターン1
ある文字列/を取り出す

その行が1行である

ある文字列/  数字 と書き出す

パターン2
ある文字列/を取り出す

その行が2行である

ある文字列/  2行の数字を足したもの と、1行に書き出す

パターン3
ある文字列/を取り出す

その行が3行である

ある文字列/  3行の数字を足したもの と、1行に書き出す

これでやりたいことが実現できそうな気がします(気だけ)。
まずは、ある文字列/を取り出す、ということをどうやるのか調べようと思います。
ありがとうございました。

【50988】Re:検索して、足し算をする方法・・・
お礼  さくら  - 07/8/24(金) 13:25 -

引用なし
パスワード
   ▼ハチ さん:
すみません、上で返信を書いている後にハチさんの投稿に気付きました。
ありがとうございます!

>このデータには「項目行」はあるのでしょうか?
項目行、というのは、以下のような、見出しのようなものですか?

元データ
名前    数量
aaa/    4
aaa/test1  3
aaa/test2  1
bbb/    6
ccc/    8
ccc/test1  4
ddd/test1  6
ddd/test2  4
eee/    2
eee/test2  3

出したい結果
名前    数量
aaa/    8
bbb/    6
ccc/    12
ddd/    10
eee/    5

ハチさんに教えていただいた、
=LEFT($A2,FIND("/",$A2))を利用すると・・・
名前    数量
aaa/    4
aaa/     3
aaa/     1
bbb/    6
ccc/    8
ccc/     4
ddd/     6
ddd/     4
eee/    2
eee/     3
というデータができました。

そしてピボットテーブルを作成(ピボットテーブルというのを今回はじめて知りました。。。)すると、出したい結果がでました!ありがとうございます。
これの一連を、「マクロの記録」で登録したので、とりあえずのコードを書いておきます。

Sub Macro1()
  Columns("A:B").Copy
  Columns("D:D").Select
  ActiveSheet.Paste
  Range("D2").FormulaR1C1 = "=LEFT(RC1,FIND(""/"",RC1))"
  Range("D2").AutoFill Destination:=Range("D2:D11"), Type:=xlFillDefault
  ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
    "Sheet1!R1C4:R11C5").CreatePivotTable TableDestination:= _
    "[Book1.xls]Sheet1!R1C7", TableName:="ピボットテーブル3", DefaultVersion:= _
    xlPivotTableVersion10
  With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("名前")
    .Orientation = xlRowField
    .Position = 1
  End With
  ActiveSheet.PivotTables("ピボットテーブル3").AddDataField ActiveSheet.PivotTables( _
    "ピボットテーブル3").PivotFields("数量"), "合計 / 数量", xlSum
  ActiveWorkbook.ShowPivotTableFieldList = False
End Sub

これをもとに、これから自分のやりたい方向へ改変していきたいと思います。
まずは。。自分のやりたいことを関数を使って実現できるようにならないと話にならないことがわかりました。。。(遅いですが。。)
何をどうしたいのか、考え方や伝え方を教えてくださったみなさま、
ありがとうございました!

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