ここから本文です

Excel VBAで、文字列を比較するには。

dqt********さん

2013/1/1510:34:50

Excel VBAで、文字列を比較するには。

画像のような表でExcelVBAを作成しています。
(実際は左右の表は別シートです。)

左の表を記載しているシート:ThisWorkbook.Worksheets("集計")
右の表を記載しているシート:ThisWorkbook.Worksheets("集計結果")

※集計結果シートには、あらかじめ数行程度合計の前に空白の行を作っています。
※集計結果シートのC列(社員数の右の列)には、SUMIF関数を入力しており、
集計シートの社名をそれぞれカウントするようになっています。

やりたい処理としては、
●集計シートのA列の文字が集計結果シートのB列にあったら何もしない
なければ、集計結果シートの4行以降の空白の行に集計結果シートのB列になかった文字を挿入する

下記コードを分かるところまで作成してみたのですが、
変数が多く混乱しています。
どう修正すればよろしいでしょうか。
宜しくお願い致します。

-------------------------------------------------------
Sub 追加()

gyo = 3・・・3行目からデータ(Aなどの文字列)があり

Do Until Worksheet1.Cells(i, 1) = ""・・・集計シートのA列が空白になるまで

For k = 3 To 4 + m ・・・集計結果シートのA,C以降の空白の行がmのつもり

If Worksheet1.Cells(i,1) = Worksheet2.Cells(k,2) Then・・・見つかったら何もしない

Else

Worksheet2.Cells(4+m,2) = 新しく見つかった文字(最初はB、次はD、その次はE)

End If

Next k

m = m + 1

gyo = gyo + 1

i= i + 1

Loop

End Sub
-------------------------------------------------------

Excel VBA,集計結果シート,集計シート,End Sub,Gyao,B&quot,A&quot

閲覧数:
737
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

ipl********さん

2013/1/1513:51:07

こんなでどうでしょう。
集計結果シートの空き行は充分あるものとしてチェックはしていません。

Sub 追加()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim r1 As Long
Dim r2 As Long
Set ws1 = Sheets("集計") '
Set ws2 = Sheets("集計結果") '
r1 = 3 'Sheet1の注目行の初期値=3
Do Until ws1.Cells(r1, "A").Text = "" '集計シートのA列注目行の値が空白になるまで
'集計結果シートのB列で集計シートのA列注目行の値を調べる
r2 = 3 '集計結果シートの注目行の初期値=3
Do While (ws2.Range("B" & r2).Text <> "") And (ws2.Range("B" & r2).Text <> ws1.Range("A" & r1).Text) '集計結果シートのB列注目行の値が""か集計シートのA列注目行の値になるまで繰り返す
r2 = r2 + 1 '集計結果シートの注目行+1
Loop
If ws2.Range("B" & r2).Text = "" Then ws2.Range("B" & r2).Value = ws1.Range("A" & r1).Text 'Doループを集計結果シートのB列注目行の値が""で抜けた場合は、集計シートのA列注目行の値を代入
r1 = r1 + 1 '集計シートの注目行+1
Loop
End Sub

質問した人からのコメント

2013/1/15 17:06:26

皆様ご回答、ありがとうございました。

ipl_is_loading様
解決出来ました。コメントを読んで、
もう少し自分で理解してみます!

porihikoletskun様
前の処理もマクロで行っていたのでマクロを使いたくて。
でも、なるほど、ピボットテーブルを使う方法もありました。

ryouko47様
お久しぶりです!
以前教えていただいた参考書で勉強をしております。
コードを理解しようと思います。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

ryo********さん

2013/1/1514:58:17

ダミーのCollectionオブジェクトを準備し、Keyを活用して重複チェックを行う方法もあります。CollectionオブジェクトはAddメソッドを実行することでコレクションに任意のデータアイテムを1つ追加することができます。この時、Keyを指定するとKeyの重複チェックが行われ、重複がある場合にはエラーが発生します。
この性質を応用すれば簡単に非重複のリストを作成することができます。ご質問の内容の場合、「社名」がKeyとなり、重複時(エラーあり)には何もしない、非重複時(エラーなし)には、集計情報へ社名を出力するという流れで目的の機能を実現することができるでしょう。

■サンプルコード
Sub Sample()
Dim m_Temp As New Collection
Dim m_ToRange As Range, m_Cell As Range

On Error Resume Next

Set m_ToRange = Worksheets("集計結果").Range("B3:B9")
m_ToRange.ClearContents

For Each m_Cell In Sheets("集計").Range("A3:A9").SpecialCells(2)
Call m_Temp.Add("", "_" & m_Cell.Value)
If Err.Number = 0 Then m_ToRange.Item(m_Temp.Count) = m_Cell.Value
Err.Clear
Next
End Sub

プロフィール画像

カテゴリマスター

por********さん

2013/1/1510:52:17

こんにちは。
1) ピボットテーブルを作成してみて、自分のやりたいことと、どれくらい違うのか、説明してください。
2) プログラムで考える場合は、まず、比較するべきデータ「集計」に、「集計結果」にあるのか、ないのか、を判定させる列を追加して、並び替えをして、「追加」とそうでないものを分けます。

それから、「計算したら、0になるデータをどのように扱うか」も考えたほうがいいです

プログラムを作成する前に、エクセルの基本機能を使い、どんなものが必要なのか、よく検討したほうがいいです

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる