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

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

ただいまの
回答率

88.34%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,260

kaori1994

score 28

初めまして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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 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データ(行数は未定)が全部読み切ったら終わりとなります。
    この回答で不十分ならお申しつけくださいませ。

    キャンセル

回答 3

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で書けばよいかはがんばってみてください

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 11:53 編集

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

    キャンセル

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 11:00

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

    キャンセル

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/25 12:08

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

    キャンセル

  • 2016/05/25 12:43

    頼られる側も案外うれしいものですから、使えるものはじゃんじゃん使って自分の力にしていきましょう^^b

    あと上記処理ですが、CSVから取得した種類が空だった場合は変な動きをすると思います。
    応用としてそこを考慮できれば完璧です。

    余力があれば頑張ってみてください。

    キャンセル

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る