プロが教えるわが家の防犯対策術!

VBA初心者です。
途中まで作ってみたのですが、コンボボックスを表示するところで
エラーが出てどうしても先に進むことができません。
ご指導お願い出来ますでしょうか。

■元データtxtファイル
A列    B列  C列  D列  E列  F列  G列
氏名  性別評価1 評価2 評価3 評価4 評価5
----------------------------------------------------
山田太郎 男  A   AB
木下花子 女  B   BA
水野四郎 男  B   BB
山瀬次郎 男  C   CA
野山達子 女  A   AA
出側三郎 男  D   DB



■EXCELファイル(txtファイルのデータを反映させるEXCEL)
シートは以下2つあります。
(1)「全体(sheet1)」:txtファイルのデータを反映させるシート
   ※例えば、B2には評価1がAの数の合計。

(2)「評価ごとの雛型(sheet2)」:評価1の評価(A、B、C・・)ごとにデータを反映させるシート
   ※例えば、評価1が「A」のデータを抽出し、雛型用のシートをコピーし、
   シートの末尾に挿入、シート名を「A」に変更し、
   B3には評価1がAの男の数の合計を入れる。


マクロの流れは、、
1.マクロが埋め込まれているEXCELを開き「ボタン」をクリック
2.テキストファイル(A)を「参照」で読込み、
3.続いてデータを反映させるEXCEL(B)を「参照」で読込み、
4."データを反映させますか?⇒はい"で「全体(sheet1)」に反映させ、
5.続いてコンボボックス(プルダウン)を表示し選択する。←★ココでエラーとなり先に進みません。
6.EXCEL(B)の「雛型」シートを末尾にコピーしデータを反映 ←ここからは自力で頑張ります。


★教えて頂きたい内容
作りかけのマクロです。http://cocolodiary.com/sample.zip
Call eSelect で呼び出したときに、
元データtxtファイルのC列をコンボボックス(プルダウン)で表示するところで
エラーになってしまいます。
ソースの★印の箇所についてご指導頂けますでしょうか。

どうぞよろしくお願い致します。

A 回答 (3件)

参考で。



『オブジェクト変数または withブロック変数が設定されていません』
が表示されたときの観点はどこか?。
この視点も必要です。

今回は対処できたけど、次に同じエラーが出たときは対処できるか。
掲示板頼りだとこれが身につきにくい。

掲示板は正しく稼働するものの回答がほとんどなので
エラーのときは、この対処がわからずパニックになるのです。
こっちを知っておく方が実際は心強い。

ありがたいことにこういうサイトもあります。
http://www.kitagawa-hanga.com/se/s_vberr.html
わざとエラーを起こしてみるのも良い。

原因については
エラーの行を特定しつつ、
「設定されていない」ということだから
認識できていない変数が使われている、とかいう
見方ができれば自己解決により近づく。

エラーが起きたけどどこがおかしいですか?
(だとこのシステムだけの話なので、)よりも
『オブジェクト変数または withブロック変数が設定されていません』
のエラーが起きるときはどういうときですか?
のが今後の活用に役立つのでは?と思いますね。
    • good
    • 0
この回答へのお礼

http://www.kitagawa-hanga.com/se/s_vberr.html

拝見させて頂きました。
すごくありがたいサイトで、さっそくお気に入りに登録しました。

エラーをわざと起こして原因を特定してみるのは近道ですね。

ありがとうございました。

お礼日時:2011/02/17 15:32

ブックはブックですから、ブックで読めたものは、テキストファイルだからファイル名が読めないなんてことはありませんが、もっと初歩的な部分です。

ローカル変数を置いているのだから、Public 変数が飛んでしまいます。全体的には、もう少し方法がある気がしますが、それはいいとします。UserForm の内容は初歩的なところでミスが目立ちます。

===
'Dim oldFile As String
'Dim newFile As String
'
'Dim newSheetName As String '集計サンプルxls
'Dim oldSheetName As String 'サンプルデータtxt
 
'●長いルーチンですから、途中からでも可能なようにしておきます。
 Dim w As Object
 If oldFile = "" Then
 For Each w In Workbooks
 If w.Name Like "*.txt" Then
  oldFile = w.Name
  oldSheetName = w.Sheets(1).Name
  Exit For
 End If
 Next w
 End If
 
'★ここから-------------------start
  'Dim lRow As Long
  Dim mData As Variant
    With Workbooks(oldFile).Sheets(oldSheetName)
      ' lRow = .Range("C" & Rows.Count).End(xlUp).Row
    mData = Application.Transpose(.Range("C2", .Cells(Rows.Count, 3).End(xlUp)).Value)
 '●私の記憶では、他のブックに対して、RowSource は取れなかったはずですが……
 '● .RowSource = oldSheetName & "!C2" & lRow これでは、取れるは思えません。
   End With
   With Me.cmbSelect '●ワークブックはUserFormの親オブジェクトではありません。
     .ColumnCount = 1
     .ColumnWidths = "50"
     .List = mData
   End With
===
    • good
    • 0
この回答へのお礼

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

------
Dim w As Object
 If oldFile = "" Then
 For Each w In Workbooks
 If w.Name Like "*.txt" Then
  oldFile = w.Name
  oldSheetName = w.Sheets(1).Name
  Exit For
 End If
 Next w
 End If

---

テキストファイルのデータを読み込むのに
こちらが必要だったのですね。

>●私の記憶では、他のブックに対して、RowSource は取れなかった
>はずですが……


まったく存じ上げませんでした。。
色々調べて、勉強し直します。
ご丁寧に本当にありがとうございました。

また重複したリストは省きたかったので
いろいろ四苦八苦しながら以下でやることにしました。


If oldFile = "" Then

For Each w In Workbooks
If w.Name Like "*.txt" Then
oldFile = w.Name
oldSheetName = w.Sheets(1).Name
Exit For
End If
Next w

End If


Retsu = "C"
topStart = Retsu & "2"
endCell = Retsu & "65536"


With Workbooks(oldFile).Sheets(oldSheetName)

Set Hani = .Range(.Range(topStart), .Range(endCell).End(xlUp))

End With

For Each cellHani In Hani
On Error Resume Next
List.Add cellHani.Value, CStr(cellHani.Value)

If Err.Number = 0 Then
cmbSelect.AddItem cellHani.Value
End If

On Error GoTo 0
Next

End Sub

早速のご回答ありがとうございました!

お礼日時:2011/02/17 15:28

ナニをしたいのかイマイチよくわかりませんが



UserFormの出現イベントで

With Workbooks(oldFile).Sheets(oldSheetName)

のoilFileに格納されている値は 元データ.txtになっていますが
.Txtファイルはブックではありませんのでこれでは参照することはできません
    • good
    • 0
この回答へのお礼

早速のご返答ありがとうございます。
txtファイルをEXCELで読み込んでいるので大丈夫だと
思ったのですが。。。

もう一度やってみます。
ありがとうございました。

お礼日時:2011/02/16 18:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!