質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2605閲覧

vbaループ処理の方法について

kaori1994

総合スコア28

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2016/05/25 01:04

初めまして22歳新卒のkaoriと申します。

今回研修としてvbaのプログラミングを学んでいるのですが
考えてもわからない点がございましたので、先輩方の知識を貸していただきたく投稿致しました。

【内容】
複数の値を指定セルに入れていく際の分岐について質問です。

⓵ if 指定セルが空白ならそのまま代入
⓶ if 値が入っていて、今回入れる値と同じなら その値の件数を + 1
⓷ if 値が入っていて、今回入れる値と同じではないなら、次の行セルにフォーカスが飛び
⓵⓶と繰り返す

ただこれだけなのですが、ループする方法の発想が思いつきません・・・

今のところ
if 指定セルの値が空白なら Then
代入
Elseif 指定セルの値 = 代入する値 Then
(1)件数を追加
Elseif 指定セルの値 <> 代入する値 Then
(2)この行は無視して次の行を調べる
EndIf

と考えているのですが、これだと指定セルが空白かつ今まで代入してきた値と被ってなかったら代入(件数も追加)を毎回行う方法がありません。というか正直わかりませんでした・・・

納期は今日中までということで、上司はいかなる手段を使ってもいいからクリアしてみなさいということで、teratailに投稿して皆さまのお力をお借りした所存です。

以上、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takito

2016/05/25 01:29

「複数の値を指定セルに入れていく」という点について教えてください。最初の値を処理して次の値に進むのは「指定セルが空白の時に値を代入」した時でしょうか?つまり「指定セルに値がある間は②と③を繰り返し、空白を見つけたら①を行って次の値に進む」ということでしょうか?
kaori1994

2016/05/25 01:37

takitoさん初めまして。 書き方がわかりにくくて申し訳ありません。 空白をみつけたら指定セル(今回A5)より前の行(A1~A4)までと比較して重複データしていたら重複した行に件数を+1します。 もし重複データではなかったら⓵になります。 このような返答でよろしいでしょうか・・・
takito

2016/05/25 01:48 編集

こちらこそ理解が悪くすみません。「件数を+1」というのは、指定セルに同値を見つけたらカウントしていく仕組みなのですね。また「複数の値」ということは、もし「1,6,3」という3つの値を処理するとして、最初の「1」の処理を終わって「6」の処理をはじめる条件はなんでしょう?
kaori1994

2016/05/25 01:59

内容が長くなると読みにくいと思って必要かな?と思ったことだけ書いたことがそもそも間違いでした・・・ csvデータを読み込む際のプログラムで 見出し【種類】、【 タイプ】 いぬ,2 ねこ,3 わんこ,2 いぬ,2 こういったcsvを一行ずつ読み込み、エクセルの種類列と件数列に追加していく形になります。この種類列には重複行はいちゃだめです。 csvデータ(行数は未定)が全部読み切ったら終わりとなります。 この回答で不十分ならお申しつけくださいませ。
guest

回答3

0

ベストアンサー

なんとなくわかってきました

処理イメージはこんな感じでしょうか
イメージ

とすると、ざっくりとした処理の流れはこんな感じになると思います

For CSVファイルの終わりまで 'ループA 'CSVから1行取り込む '分解して【種類】を取り出す For i = 1 to 検索セルの終わりまで 'ループB If 検索セル(i,1)の値が空白 Then '新しいレコードの追加 検索セル(i,1) = 種類 検索セルの件数(i,3) = 1 Exit For 'ループBを抜ける else if 検索セル(i,1)と種類が一致 Then '既存レコード件数の加算 検索セルの件数(i,3) = 検索セルの件数(i,3)+1 End if Next i 'ループB Next 'ループA

考え方をそのままコードにしただけなので、具体的にどのようにVBAで書けばよいかはがんばってみてください

どこか認識違いがあるようでしたら、「このあたりが実はこうなんです」と補足いただければと思います

投稿2016/05/25 02:34

takito

総合スコア3111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaori1994

2016/05/25 03:01 編集

takitoさん、お世話になっております。 この短時間かつ私の文章でここまで理解して頂けるとは・・・ 素直に尊敬致します。 私のお伝えしたいことがすべて反映されております。 非常に感謝いたします。 vbaの書き方は自分自身で調べるのは当然だと思っておりますので、頑張ります! また何か躓いてしまったらtakitoさんにご相談させて頂くかもしれませんが お時間があるときにご回答いただけたら幸いです。 ありがとうございました!
guest

0

(これは個人的な意見ですが)
「いかなる手段を使ってでも」という手段を選択する中で、「オープンな掲示板で質問する」という選択肢の前に「今行き詰っていることを上司に相談し、アドバイスをもらう」ということの方が先にあるべきかなと思います。

抱えている問題を独力で解決する能力も身に着けていかなければなりませんが、現時点で独力で解決できない問題を上司や同僚に的確に伝え・相談し・解決に導くコミュニケーション能力は、社会人に必要な能力で、評価に値するものと思いますので。
(既に相談したうえでの質問でしたらすみません。)


質問に対するアドバイスですが、「指定セル」と「代入する値」、「調べる行」、これらがどう変わっていくのかが分からないためアドバイスが難しいです。
これらの関係性を補足してもらえると回答がしやすいです。
※処理前のシートのイメージと、処理後のイメージがあるとうれしいです。


追記

修正依頼コメントへの回答からおおよその処理が把握できましたので、追記します。

VBA

1'CSV取得ループ 2Do 3 'CSV取得処理 4 '~ここは割愛~ 5 6 'ここから今回のチェック 7 strKind = 種類 'CSVから取得した【種類】 8 9 '種類チェックループ 10 iRow = 1 11 Do 12 If Cells(iRow, 1) = "" Then 13 '①空セルまでに同じ種類が見つからなった場合、新規に種類作成・件数=1 14 Cells(iRow, 1) = strKind 'A列に種類をセット 15 Cells(iRow, 2) = 1 'B列に件数1をセット 16 'ループを抜ける 17 Exit Do 18 ElseIf Cells(iRow, 1) = strKind Then 19 '②同じ種類が既にある場合、件数+1 20 Cells(iRow, 2) = Cells(iRow, 2) + 1 'B列の件数を+1 21 'ループを抜ける 22 Exit Do 23 Else 24 '①でも②でもなかった場合(空セルでないが種類も違う場合)、次のセルをチェック 25 iRow = iRow + 1 26 EndIf 27 Loop 28 29Loop

こんな感じでどうでしょう?

投稿2016/05/25 02:05

編集2016/05/25 02:27
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaori1994

2016/05/25 03:08

jawaさん、返信が遅れて申し訳ありません。 個人的な意見について確かに!と思わされる点が多々ありました。 そのような意見を頂けることにとても感謝しております。ありがとうございます! また追記内容について、直接やりとりをしていたわけではないにも関わらずご丁寧にありがとうございます。 しかも内容が完璧です!jawaさんの回答も参考に頑張ってシステムを作ってみます! ありがとうございました!
jawa

2016/05/25 03:43

頼られる側も案外うれしいものですから、使えるものはじゃんじゃん使って自分の力にしていきましょう^^b あと上記処理ですが、CSVから取得した種類が空だった場合は変な動きをすると思います。 応用としてそこを考慮できれば完璧です。 余力があれば頑張ってみてください。
guest

0

一応これで対応可能かと思いますが
Cellの値は、X
代入の値は、Yとします
件数を、Zとします
'-------------------
Yがループ条件とし、1から10だと
Z = 0
Y = 1
Do While Y < 11
Select Case X
Case ""
X = Y
Case X
Z = Z + 1
Case Else
X = X
End Select

Y = Y + 1

Loop

投稿2016/05/25 01:36

katare

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaori1994

2016/05/25 02:00

katareさん、初めまして回答ありがとうございます。 初心者の私でも分かりやすい書き方でありがとうございます! 参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問