Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

複数のファイルを読み込む。につ いて

3 views
Skip to first unread message

Yoshiaki Kawajiri

unread,
Aug 16, 2003, 8:12:40 PM8/16/03
to
川尻@札幌です。

鴻池さん色々力になっていただきありがとうございます。

下のように組みました。
Sub start_test()
Dim tobook As Workbook
Dim tosheet As Worksheet

Set tobook = ActiveWorkbook
Set tosheet = ActiveSheet
ファイルの読み込み_Click tobook, tosheet
End Sub


Private Sub ファイルの読み込み_Click(tobook As Workbook, tosheet As
Worksheet)

Dim tmp As Variant
Dim i As Integer
Dim msg As String

Dim ac As Workbook

tmp = Application.GetOpenFilename("Excel(*.xls),*.xls", , _
"交通量ファイルを複数選択してください", , True)
If (VarType(tmp) = vbBoolean) Then
Exit Sub
Else
For i = LBound(tmp) To UBound(tmp)
msg = msg & Str(i) & ":" & tmp(i) & vbCrLf
Next i
End If
MsgBox msg

For i = LBound(tmp) To UBound(tmp)
Workbooks.Open tmp(i)
Set ac = ActiveWorkbook
start_copysheet tobook, tosheet
ac.Close SaveChanges:=False
Next i

End Sub

Sub start_copysheet(tobook As Workbook, tosheet As Worksheet)
#Const beta = 1 '確認が不要の場合は値を0にする。
Dim lrto As Long
Dim lrfrom As Long
Const sh = "Sheet(1)" '特定のシート名はここで変更する。

For Each bk In Workbooks
tobook.Activate
tosheet.Select
lrto = find_last_row()
bk.Activate
If Not ThisWorkbook Is bk And Not tobook Is bk Then
On Error GoTo errnotfind
Sheets(sh).Select
lrfrom = find_last_row()
If lrfrom > 0 Then
Rows(Trim(Str(1)) & ":" & Trim(Str(lrfrom))).Select
Selection.Copy
tobook.Activate
tosheet.Activate
On Error GoTo errov
#If beta Then
Cells(lrto + 2, 1).Select
Selection.PasteSpecial
Application.CutCopyMode = False
Cells(lrto + 1, 1).Value = bk.Name & " + (シート名:
" & sh & ")"
Cells(lrto + 1, 1).Font.ColorIndex = 3
#Else
Cells(lrto + 1, 1).Select
Selection.PasteSpecial
#End If
End If
End If
ne:
Next
Exit Sub

errnotfind:
MsgBox bk.Name & " のシート " & sh & " が見つかりません。"
Resume ne

errov:
MsgBox "コピー行数が多すぎます。"

End Sub

Function find_last_row() As Long
Dim sm As Range
Dim pre As Range
Dim n, m As Integer

On Error GoTo errfs

Set pre = ActiveCell
Cells.SpecialCells(xlCellTypeConstants, 23).Select
Set sm = Selection
n = sm.Areas.Count
sm.Areas(n).Select
Set sm = Selection

If sm.Count > 1 Then
sm.End(xlDown).Select
n = Selection.Row
Else
n = Selection.Row
End If
fs:
On Error GoTo errse

Cells.SpecialCells(xlCellTypeFormulas, 23).Select
Set sm = Selection
m = sm.Areas.Count
sm.Areas(m).Select
Set sm = Selection

If sm.Count > 1 Then
sm.End(xlDown).Select
m = Selection.Row
Else
m = Selection.Row
End If
se:
pre.Activate
If n > m Then
find_last_row = n
Else
find_last_row = m
End If

Exit Function

errfs:
n = 0
Resume fs
errse:
m = 0
Resume se

End Function
を実行すると

Private Sub ファイルの読み込み_Click(tobook As Workbook, tosheet As
Worksheet)
の部分で
コンパイルエラー:プロシージャの宣言が、イベントまたはプロシージャの定義
と一致していません。
とメッセージが出ます。
解決するいい手段はありませんか?

koun...@mbh.nifty.com

unread,
Aug 17, 2003, 12:23:01 AM8/17/03
to
鴻池です。

"Yoshiaki Kawajiri" <yoshiaki...@toll.co.jp> wrote in message
news:3F3EC878...@toll.co.jp...
> 川尻@札幌です。


> Private Sub ファイルの読み込み_Click(tobook As Workbook, tosheet As
> Worksheet)
> の部分で
> コンパイルエラー:プロシージャの宣言が、イベントまたはプロシージャの定義
> と一致していません。
> とメッセージが出ます。

リーダだと変なところで改行が入ったりで,コピー貼り付けだけでは上手くいかない
場合があります。VBのエディターでコードがすべてエラーなしか確認して見て下さ
い。まあ,エラーの内容をみると,これが原因とは思え難いのですが。バージョンの
違いかな。バージョンは何ですか?

それでも,エラーが出るようであれば強引ですが,次の2つのsubの変数を下記のよ
うにvariantにしてみる。

Private Sub ファイルの読み込み_Click(tobook As Workbook, tosheet As 
Worksheet)


Private Sub ファイルの読み込み_Click(tobook , tosheet)
と変更する。

Sub start_copysheet(tobook As Workbook, tosheet As Worksheet)


Sub start_copysheet(tobook, tosheet)
と変更する。

これでも,ダメならよく分かりません。見えないけど何か変なものが残っていると
か。それなら,全く新規のブックに書き直して見るとか。これくらいしか,今のとこ
ろ思いつきません。

--
******************************
keizi kounoike
******************************

H.Uchimura

unread,
Aug 17, 2003, 8:01:13 AM8/17/03
to
H.Uchimuraです。

Yoshiaki Kawajiriさんの<3F3EC878...@toll.co.jp>から


>Private Sub ファイルの読み込み_Click(tobook As Workbook, tosheet As
>Worksheet)
>の部分で
>コンパイルエラー:プロシージャの宣言が、イベントまたはプロシージャの定義
>と一致していません。

「ファイルの読み込み」という名前のボタンか何かが
存在してるんじゃないですか?
ボタン等のイベントプロシージャは、引数の数、型が決まっていますから、
それを変更してしまうとこのようなコンパイルエラーになります。
何でもいいですが関数名を変えたらいいんじゃないでしょうか。

個人的な好みになりますが、VBはイベントプロシージャ名や
Implementsしたメソッド名にアンダースコアを使用するので、
私は自分で定義するメソッド名にアンダースコアは使いません。

--
H.Uchimura

koun...@mbh.nifty.com

unread,
Aug 17, 2003, 10:26:35 PM8/17/03
to
鴻池です。

"H.Uchimura" <hu...@remus.dti.ne.jp> wrote in message
news:bhnqrj$r1a$1...@newsl.dti.ne.jp...


> H.Uchimuraです。
>
> Yoshiaki Kawajiriさんの<3F3EC878...@toll.co.jp>から
> >Private Sub ファイルの読み込み_Click(tobook As Workbook, tosheet As
> >Worksheet)
> >の部分で
> >コンパイルエラー:プロシージャの宣言が、イベントまたはプロシージャの定義
> >と一致していません。
>
> 「ファイルの読み込み」という名前のボタンか何かが
> 存在してるんじゃないですか?
> ボタン等のイベントプロシージャは、引数の数、型が決まっていますから、
> それを変更してしまうとこのようなコンパイルエラーになります。
> 何でもいいですが関数名を変えたらいいんじゃないでしょうか。

なるほど,そうゆうことですか。てっきり,すべて標準モジュールに書かれているも
のと思い込んでいました。組み合わせたとか言っていたから,標準モジュールの同一
モジュールに書いているものだと思い込んでいました。でないと,Private Sub な
ら他のモジュールからはアスセスできないはずだし。関数名を変えてもいいですが,
そのボタンに割り付けている


Private Sub ファイルの読み込み_Click(tobook As Workbook, tosheet As 
Worksheet)

を元のコードに戻してもいいと思います。

Private Sub ファイルの読み込み_Click()
 元のコード
end sub

ともかく,標準モジュールの同一モジュールに書く必要があります。Privateを使用
したいなら。

0 new messages