dポイントプレゼントキャンペーン実施中!

リストボックスを作り、そこに開いてるexcelブックを表示させて選択できるようにしてあるのですが、リストを選択してボタンを押したら、選択したブックのsheet1のA1~B80をマクロのあるブックの"処理用"sheetのA列B列にコピーなるようにしたいのですが上手くいきません

マクロ.xlsmの
リストはActiveコントロールのリストボックスを作り
Private Sub ListBox1_GotFocus()
    Dim wbook As Integer
    ListBox1.Clear
    For wbook = 1 To Workbooks.Count
        ListBox1.AddItem Workbooks(wbook).Name
    Next wbook
End Sub
としてます。

で、別にボタンを作り

Sub ボタン_Click()
Dim target As Variant
Worksheets("マクロ").Select
target = Worksheets("処理用").ListBox1.Text

Workbooks(target).Activate
Sheets(1).Select
Sheets(1).Range(Cells(1, 1), Cells(80,2)).Copy
ThisWorkbook.Worksheets("処理用").(Cells(1, 1), Cells(80,2)).PasteSpecial
(以下略)

と続くのですが、実際に作動させると
Workbooks(target).Activateで「型が一致しません」となりエラーとなってしまいます。

"処理用"シートのD1に直接ファイル名を書いて、
target = Cells(4, 1)
Workbooks(target & ".xlsx").Activate
とやってた時はうまくいったのですが…

いろいろ調べてますが直せず困ってます…

質問者からの補足コメント

  • つらい・・・

    実は最初はStringにしてました。
    確か同様のエラ―が出て無理だったはずです。。。(今手元にないので確認はできませんが)
    あと途中の所でおかしなところあるかも知れませんが(Worksheets("マクロ").Selectあたり)
    実際組んでるのとは違っていて(問題ある所以外は簡略化してます)
    リストボックス使ってない時は問題なく動作したのでそこは問題ないとします

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/07/08 23:55

A 回答 (4件)

やっぱりtargetの型はstringにすべきですね。


そうすれば、target = Worksheets("処理用").ListBox1.Textの時点で落ちるはずなので問題の切り分けが出来ます。対処も見つかると思います。
    • good
    • 0
この回答へのお礼

Stringに戻してまたいろいろ調べた所、「型が一致しない」というエラーは、targetに何も入ってなかった為に出ていたようです。

その後、ちょこちょこ修正したら動くようになりました。

シートやブックの選択がうまくかみ合ってなかったのが原因っぽいです

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

お礼日時:2016/07/09 11:34

少し割り込み、お邪魔します。


target という変数名は、ちょっと引っかかるけれども、

>Dim target
>
>target = ThisWorkbook.Worksheets("処理用").ListBox1.Text

target のデータ型がVariant であろうが、String 型であろうが、ListBox1 から正しく取れていれば、「型が一致しません」というようなエラーはでません。

このエラーは、Listbox のプロパティの設定の違いによって起きているような気がします。

ListBox のProperty の中の、MultiSelect 0-fmMultiSelectSingle は選んでありますか?

この田中さん、こういうことを書いていますが、
http://officetanaka.net/excel/vba/tips/tips141.htm

私なら、ListBox は以下のように設定しています。私は古い?
以下は、そのままでは、MultiSelect は使えないけれども、すぐに変えられるようにしています。

'//
Private Sub CommandButton1_Click() 'フォーム・コントロールでも可
Dim strTxt ' As String
Dim i As Long
For i = 0 To Me.ListBox1.ListCount
  If Me.ListBox1.Selected(i) Then
      strTxt = Me.ListBox1.List(i)
      If strTxt <> "" Then
        Exit For
      End If
  End If
Next i
With Workbooks(strTxt).Sheets(1)
  .Range(.Cells(1, 1), .Cells(80, 2)).Copy
End With
Dim LastRow As Long
With ThisWorkbook.Worksheets("処理用")
   LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
  If LastRow > 1 Then LastRow = LastRow + 1
  .Cells(LastRow, 1).PasteSpecial (xlPasteValues)
  ''上書きモード(二者択一)
  ''.Range("A1").PasteSpecial (xlPasteValues)
End With
'
''(以下略)
Application.CutCopyMode = False
End Sub
'//

こちらの指摘は、当たっていないかもしれません。
ただ、エラーが出た時、そこに「ブレークポイント●」を置いて、ローカルウィンドウで、その変数の値をみれば、ほぼ、100%問題はどこにあるか分かるはずです。ご自分で分からなくても、その入った値は、こんなのでした、だけでも分かるものなのです。

私は、配列が混じりこんだような気がします。
    • good
    • 0
この回答へのお礼

「型が一致しない」というエラーは実際には上手くリストから取得できてなかったのが原因だったようで
自己解決しました。

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

お礼日時:2016/07/09 11:36

>Workbooks(target).Activateで「型が一致しません」となりエラーとなってしまいます。


この時、targetにちゃんとブック名が設定されているのは確認しました?
    • good
    • 0
この回答へのお礼

うーん・・・

一応、Msgbox(target)
で確認もしてまして
結果、「○○○.xlsx」となってました。
あとごちゃごちゃしたの全部なくして
ただ、アクティブにさせる事は出来ないかやってみましたが
大体変わらず稀にアクティブになるという良く分からない挙動になりました

お礼日時:2016/07/09 00:17

targetの型をstringに変えてみても無理?

この回答への補足あり
    • good
    • 0

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