vbaループ処理の方法について
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 2,260
初めまして22歳新卒のkaoriと申します。
今回研修としてvbaのプログラミングを学んでいるのですが
考えてもわからない点がございましたので、先輩方の知識を貸していただきたく投稿致しました。
【内容】
複数の値を指定セルに入れていく際の分岐について質問です。
⓵ if 指定セルが空白ならそのまま代入
⓶ if 値が入っていて、今回入れる値と同じなら その値の件数を + 1
⓷ if 値が入っていて、今回入れる値と同じではないなら、次の行セルにフォーカスが飛び
⓵⓶と繰り返す
ただこれだけなのですが、ループする方法の発想が思いつきません・・・
今のところ
if 指定セルの値が空白なら Then
代入
Elseif 指定セルの値 = 代入する値 Then
(1)件数を追加
Elseif 指定セルの値 <> 代入する値 Then
(2)この行は無視して次の行を調べる
EndIf
と考えているのですが、これだと指定セルが空白かつ今まで代入してきた値と被ってなかったら代入(件数も追加)を毎回行う方法がありません。というか正直わかりませんでした・・・
納期は今日中までということで、上司はいかなる手段を使ってもいいからクリアしてみなさいということで、teratailに投稿して皆さまのお力をお借りした所存です。
以上、よろしくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
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で書けばよいかはがんばってみてください
どこか認識違いがあるようでしたら、「このあたりが実はこうなんです」と補足いただければと思います
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
(これは個人的な意見ですが)
「いかなる手段を使ってでも」という手段を選択する中で、「オープンな掲示板で質問する」という選択肢の前に「今行き詰っていることを上司に相談し、アドバイスをもらう」ということの方が先にあるべきかなと思います。
抱えている問題を独力で解決する能力も身に着けていかなければなりませんが、現時点で独力で解決できない問題を上司や同僚に的確に伝え・相談し・解決に導くコミュニケーション能力は、社会人に必要な能力で、評価に値するものと思いますので。
(既に相談したうえでの質問でしたらすみません。)
質問に対するアドバイスですが、「指定セル」と「代入する値」、「調べる行」、これらがどう変わっていくのかが分からないためアドバイスが難しいです。
これらの関係性を補足してもらえると回答がしやすいです。
※処理前のシートのイメージと、処理後のイメージがあるとうれしいです。
追記
修正依頼コメントへの回答からおおよその処理が把握できましたので、追記します。
'CSV取得ループ
Do
'CSV取得処理
'~ここは割愛~
'ここから今回のチェック
strKind = 種類 'CSVから取得した【種類】
'種類チェックループ
iRow = 1
Do
If Cells(iRow, 1) = "" Then
'①空セルまでに同じ種類が見つからなった場合、新規に種類作成・件数=1
Cells(iRow, 1) = strKind 'A列に種類をセット
Cells(iRow, 2) = 1 'B列に件数1をセット
'ループを抜ける
Exit Do
ElseIf Cells(iRow, 1) = strKind Then
'②同じ種類が既にある場合、件数+1
Cells(iRow, 2) = Cells(iRow, 2) + 1 'B列の件数を+1
'ループを抜ける
Exit Do
Else
'①でも②でもなかった場合(空セルでないが種類も違う場合)、次のセルをチェック
iRow = iRow + 1
EndIf
Loop
Loop
こんな感じでどうでしょう?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
takito
2016/05/25 10:29
「複数の値を指定セルに入れていく」という点について教えてください。最初の値を処理して次の値に進むのは「指定セルが空白の時に値を代入」した時でしょうか?つまり「指定セルに値がある間は②と③を繰り返し、空白を見つけたら①を行って次の値に進む」ということでしょうか?
kaori1994
2016/05/25 10:37
takitoさん初めまして。
書き方がわかりにくくて申し訳ありません。
空白をみつけたら指定セル(今回A5)より前の行(A1~A4)までと比較して重複データしていたら重複した行に件数を+1します。
もし重複データではなかったら⓵になります。
このような返答でよろしいでしょうか・・・
takito
2016/05/25 10:46 編集
こちらこそ理解が悪くすみません。「件数を+1」というのは、指定セルに同値を見つけたらカウントしていく仕組みなのですね。また「複数の値」ということは、もし「1,6,3」という3つの値を処理するとして、最初の「1」の処理を終わって「6」の処理をはじめる条件はなんでしょう?
kaori1994
2016/05/25 10:59
内容が長くなると読みにくいと思って必要かな?と思ったことだけ書いたことがそもそも間違いでした・・・
csvデータを読み込む際のプログラムで
見出し【種類】、【 タイプ】
いぬ,2
ねこ,3
わんこ,2
いぬ,2
こういったcsvを一行ずつ読み込み、エクセルの種類列と件数列に追加していく形になります。この種類列には重複行はいちゃだめです。
csvデータ(行数は未定)が全部読み切ったら終わりとなります。
この回答で不十分ならお申しつけくださいませ。