[[20160205123555]] 『AddItem以外の追加方法』(ピューマ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『AddItem以外の追加方法』(ピューマ)

こんにちは。昨日回答いただいた方ありがとうございました。

また質問させていただきます。

あるブックから指定の条件をもとにとってきたデータをリストボックス1に表示させています。
リストボックス1にあるデータはシート2の一覧表のB列に全て載っています。
B列は、あらかじめ降順でも昇順でもない任意の順番に並べてあります。
このB列の順番をもとに、リストボックス1も並べ替えをしたいのですが、どのように記述すれば良いでしょうか。

UserForm1.ListBox1.AddItem Cells(Row, "B")

一覧表のA列にある文字と、あるデータを一行ずつ比較して同じならB列の文字をリストボックスに入れるという処理です。

リストボックスのRowSourceに「シート名!B:B」と入れて、動かしてみたところ、上記のコードでエラーがでました。
実行時エラー '70';
書き込みできません。

B列の任意の並びをもとにリストボックスを並べ替えるにはRowSourceしかないのでしょうか。
その場合、AddItem以外でリストボックスにデータを追加する方法はありますでしょうか。
どうぞ宜しくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 With Sheets("シート2")
     UserForm1.ListBox1.List = .Range("B2", .Range("B" & Rows.Count).End(xlUp)).Value
 End With

 でB2からB列最終行まで表示されるはずですが?
 あらかじめRowSource プロパティを空白にしておかないとエラーになりますよ?
(seiya) 2016/02/05(金) 12:48

seiyaさん回答ありがとうございます。

書き方がわかりにくく申し訳ないのですが、シート2のB列をすべて表示させたいわけではなく、
シート2のA列にある文字と、あるブックのデータを比較して、一致すればその行のB列にあるデータをリストボックスに入れたい、ということです。
これはfor文を使ってA1:A50までを見ています。
リストボックスに入れるまではできているのですが、並びを任意の並び(シート2のB列のように)にしたいのです。
(ピューマ) 2016/02/05(金) 13:05


 seiyaさんからコメントあるように、ListBox や ComboBox の RowSource 指定 と Listへの格納は、二者択一です。

 AssItem も Listへの格納ですから、RowSource は空白にしておかなければいけません。

(β) 2016/02/05(金) 13:09


βさん回答ありがとうございます。

RowSourceを空にしておく場合は、どのように任意の並び替えを指定すれば良いでしょうか?
すみません、これ以外の方法が調べても見つからなかったので。。
(ピューマ) 2016/02/05(金) 13:11


 >あるブックから指定の条件をもとにとってきたデータをリストボックス1に表示させています。 

 ここのところの処理がどうなっているのかが不明
(seiya) 2016/02/05(金) 13:20

seiyaさん

For Each Rng In c.Range("A1:A50")

    If Rng.Value <> "" Then
        If p = Rng.value Then
            UserForm1.ListBox1.AddItem c.Cells(Rng.Row, 2)
            Exit For
        End If
    End If
Next

こんな感じになっています
Rng = シート2のA列
p = 比較するデータ
(ピューマ) 2016/02/05(金) 13:29


 c.Range("A1:A50") は別ブックのシート上のセル範囲ですね?
 Exit For でループを抜けていますが,ListBox1には1データのみですか?
(seiya) 2016/02/05(金) 13:37

seiyaさん

すみません、別ブックではなくて、フォルダ上のファイル名と比較していました。
今のコードと相違があったので、再度UPします。

Set xlAPP = Application

    vntPathName = xlAPP.InputBox("参照するフォルダ名を入力して下さい。", _
                                 cnsTitle, "C:\")
    If VarType(vntPathName) = vbBoolean Then Exit Sub
    strPathName = vntPathName

    If Dir(strPathName, vbDirectory) = "" Then
        MsgBox "指定のフォルダは存在しません。", vbExclamation, cnsTitle
        Exit Sub
    End If

    strFileName = Dir(strPathName & cnsDIR, vbNormal)

Do While StrFileName <>""

For Each Rng In c.Range("A1:A50")

    If Rng.Value <> "" Then
        If StrFileName = Rng.value Then
            UserForm1.ListBox1.AddItem c.Cells(Rng.Row, 2)
            Exit For
        End If
    End If
Next
strFileName = Dir()
Loop

(ピューマ) 2016/02/05(金) 13:43


 一度Dictionaryに格納して
  Set dic = CreateObject("Scripting.Dictionary")
 Set xlAPP = Application 
    vntPathName = xlAPP.InputBox("参照するフォルダ名を入力して下さい。", _
                                 cnsTitle, "C:\")
    If VarType(vntPathName) = vbBoolean Then Exit Sub
    strPathName = vntPathName
    If Dir(strPathName, vbDirectory) = "" Then
        MsgBox "指定のフォルダは存在しません。", vbExclamation, cnsTitle
        Exit Sub
    End If
    strFileName = Dir(strPathName & cnsDIR, vbNormal)
Do While StrFileName <>"" 
For Each Rng In c.Range("A1:A50") 
    If Rng.Value <> "" Then
        If StrFileName = Rng.value Then dic(c.Cells(Rng.Row, 2).Value) = Empty
            Exit For
        End If
    End If
Next
strFileName = Dir()
Loop

With Sheets("シート2")

    For Each Rng In .Range("b2",.Range("b" & Rows.count).End(xlup))
        If dic.Exists(CStr(Rng.Value)) Then UserForm1.AddItem Rng.Value
    Next
End with

 こんなことですか?
(seiya) 2016/02/05(金) 13:54

seiyaさん
丁寧にありがとうございます!
まさにこの通りで、とてもありがたいのですが、
実は全く同じデータが複数ある場合がありまして、
その場合はその数だけすべて表示させたいのですが、その場合はどこを触れば良いでしょうか?
シート2のB列にいちご、りんご、みかん、とあって、みかんの行のA列と合致したファイル名が3つあれば、連続して
みかん
みかん
みかん
と表示させたいのですが。。
(ピューマ) 2016/02/05(金) 14:19

 複数表示されていませんか?
 もしかして、並べ替えをしたいのですか?
(seiya) 2016/02/05(金) 14:31

seiyaさん

複数表示もありますし、並べ替えもしたいです。
うまく書けるかわかりませんが、詳しく書いてみます。

フォルダ内のファイル名は品名と記号番号が書かれていまして、その記号番号と
シート2のA列にある記号番号を比べて、同じならB列にある正式な品名をとってくるというものです。
フォルダの中に「ケーキ S0001」「ケーキ K0001」「ケーキ H0001」「ケーキ K0002」の4つファイルがあった場合、
A列と比べて、記号番号が合致したB列の「いちご」「クリーム」「クリーム」「薄力粉」の順番でリストボックスに表示させたい、ということです。
この順番とは、シート2のB列の順番です。

試してみたら、「いちご」「クリーム」「薄力粉」という風になったので、連続して同じデータでも複数表示できないかなと思いました。。
(ピューマ) 2016/02/05(金) 14:47


 シート2のA列にある記号番号に合致する分は全て表示されるはずですが?
 A,B
 ケーキ S0001,いちご
 ケーキ S0001,いちご
 ケーキ S0001,いちご
 ケーキ K0001,クリーム
 ケーキ K0001,クリーム
 ケーキ K0001,クリーム

 ということであれば、
 いちご
 いちご
 いちご
 クリーム
 クリーム
 クリーム

 になりませんか?
(seiya) 2016/02/05(金) 14:57

 >シート2のB列にいちご、りんご、みかん、とあって、みかんの行のA列と合致したファイル名が
 A列と比較?

 If dic.Exists(CStr(Rng(,0).Value)) Then UserForm1.AddItem Rng.Value

 こういうこと?
(seiya) 2016/02/05(金) 14:59

seiyaさん

シート2は、
A   B
A000 小豆
C000 チーズ
H000 薄力粉
K000 クリーム
N000 納豆
S000 いちご

という感じになっていて、Likeを使用して「*S000*」としています。
なのでシート2には同一のものはないんですが、ファイル名に「S0001」「S0002」と複数ある場合があります。
これが、今は複数ファイルがあっても一つしかリストボックスには表示されません。。

追記します。
シート2に同一のものはないと書きましたが、一部同一のものがあります。
例えると、「オーディオプレーヤー」という商品名で、記号番号が「IP000」「SO000」「PA000」と複数記号番号がある場合は、連続して書いています。

A     B
IP000  オーディオプレーヤー
SO000  オーディオプレーヤー
PA000  オーディオプレーヤー

(ピューマ) 2016/02/05(金) 15:10


 もしかして

 c.Range("A1:A50")
 このcはシート2のことで、A/B列は同一シート上?

 >Likeを使用して「*S000*」としています。 
 どこで?
(seiya) 2016/02/05(金) 15:34

seiyaさん

> c.Range("A1:A50")
> このcはシート2のことで、A/B列は同一シート上?

シート2のことで、同一シート上です。

Likeは、
If StrFileName = Rng.value Then
ここで使用しています。正確には、

If StrFileName Like "*" & Rng.value & "*" Then

でした。

また、
>If dic.Exists(CStr(Rng.Value)) Then UserForm1.AddItem Rng.Value
この部分で、システムエラー(H80004005)が起きてしまいました。

(ピューマ) 2016/02/05(金) 16:06


 >Do While StrFileName <>"" 
 >For Each Rng In c.Range("A1:A50") 
 >    If Rng.Value <> "" Then
 >        If StrFileName = Rng.value Then dic(c.Cells(Rng.Row, 2).Value) = Empty
 >            Exit For
 >        End If
 >    End If
 >Next
 >strFileName = Dir()
 >Loop
 を
 strFileName = Dir()
 >Loop
 を
 Do While StrFileName <>""
     dic(StrFileName)=Empty
strFileName = Dir()
Loop

 >With Sheets("シート2") 
 >   For Each Rng In .Range("b2",.Range("b" & Rows.count).End(xlup))
 >       If dic.Exists(CStr(Rng.Value)) Then UserForm1.AddItem Rng.Value
 >   Next
 >End with

 を
 Dim e
 With Sheets("シート2") 
    For Each e in dic
        For Each Rng In .Range("b2",.Range("b" & Rows.count).End(xlup))
            If e Like "*" & Rng(,0).Value & "*" then UserForm1.AddItem Rng.Value
        Next
    Next
 End with

 では?

(seiya) 2016/02/05(金) 16:19


[[20160204162931]] 『ファイル名に特定の文字列を含むファイルがあるか』(ピューマ)

 前回の質問に回答したが、全然違う話になってるよねぇ。
 前回何を学んだか教えてほしいわ・・・
(稲葉) 2016/02/05(金) 16:27

稲葉さん
前回は回答いただきありがとうございました。
今回は別のブックでの話で、前回のブックと共通する点もあるんですが
知識が至らないためか中々応用できず質問させていただきました。
(ピューマ) 2016/02/05(金) 16:48

 前回のコードは並べ替えしていませんよ?
 つまり解決してないのに、次の質問は別の内容ということですか?

 私のコードではAddItemではなく、Listを使って値を取り込んでいます。
 コードを理解してもいないくせに、よくそういうこと言えますねぇ。
(稲葉) 2016/02/05(金) 17:13

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.