Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10983 / 13646 ツリー ←次へ | 前へ→

【18781】functionが呼び出されない! ともちゃん 04/10/11(月) 15:16 質問[未読]
【18783】Re:functionが呼び出されない! Asaki 04/10/11(月) 15:46 回答[未読]
【18786】Re:functionが呼び出されない! ともちゃん 04/10/11(月) 16:57 質問[未読]
【18792】Re:functionが呼び出されない! ichinose 04/10/11(月) 19:23 回答[未読]
【18815】Re:functionが呼び出されない! ともちゃん 04/10/13(水) 10:45 お礼[未読]

【18781】functionが呼び出されない!
質問  ともちゃん  - 04/10/11(月) 15:16 -

引用なし
パスワード
   現在、勤怠データの集計をマクロで行うためのプログラム中なのですが、大変不可解な壁に当たって困っています。

時間を表す10.3(=10時間30分)などの数字を足したり引いたりする関数を作り、private functionで宣言しました。ところが、その関数をいざ使おうとすると、関数が呼び出されず、戻り値がEmptyになってしまいます。ステップ実行をするのですが、確かに実行されていませんでした。

ためしに、フォームに別のボタンを作り、その関数だけを呼び出すとちゃんと実行されるのですが、本物のボタンの方では、実行されません。

ちなみに、そのfunctionを呼び出すまでには、ファイルのオープンやコピー・貼り付けをして、データの行数分のループの中で呼び出しています。

なにかお分かりの方がいらっしゃいましたら、ご指導ください。

【18783】Re:functionが呼び出されない!
回答  Asaki  - 04/10/11(月) 15:46 -

引用なし
パスワード
   こんにちは。

>private functionで宣言しました。
何処に書き込んでいますか?
また、何処からどのように使うのでしょうか?

コンパイルでは、エラーはでないのですね?
実際に、内容をUpできませんか?

【18786】Re:functionが呼び出されない!
質問  ともちゃん  - 04/10/11(月) 16:57 -

引用なし
パスワード
   さっそくのレス、有難うございます。コードはちょっと長いので、遠慮してたんですが、やっぱり見ていただいたほうが良いようなのでアップします。
とてもへたくそなコードだと思いますが、ご意見お願いします。


これは、メニューボタンを貼った、フォームの(シートではない)の関数、及びイベントです。

' 10.5 + 2.10 = 13.0 で計算で計算結果を返す(→意味:10:50+2:10=13:00)
Private Function 時分合計(ctime1, ctime2)
Dim 時数1 As Integer
Dim 時数2 As Integer
Dim 分数1 As Integer
Dim 分数2 As Integer
Dim 計時数 As Integer
Dim 計分数 As Integer

 時数1 = Int(ctime1) '切捨て
 時数2 = Int(ctime2) '切捨て
 分数1 = (ctime1 - 時数1) * 100
 分数2 = (ctime2 - 時数2) * 100
 計分数 = 分数1 + 分数2
 計時数 = 時数1 + 時数2 + ((分数1 + 分数2) \ 60)
 計分数 = 計分数 - (60 * ((分数1 + 分数2) \ 60))
 時分合計 = 計時数 + (計分数 / 100)

End Function


'データファイルインポート → 計算
Private Sub BtnInport_Click()
Dim Ret As Variant
Dim sFullname As String
Dim iEndRow As Integer
Dim iRow As Integer 'ループカウンタ
Dim 時間内労働
 
 Application.ScreenUpdating = False
 'ファイルを指定
 CurDir (ThisWorkbook.Path)
 Ret = Application.GetOpenFilename("CSVファイル(*.csv), *.csv")
 If Ret = False Then
  Exit Sub 'キャンセル
 End If
 
 'パス・ファイル名の取得
 sFullname = Ret
 'メニュー画面を閉じる
 Unload Me

 'CSVファイルを開いて、「勤怠シート」にデータを貼り付け
 Workbooks.Open Filename:=sFullname
 Cells.Select
 Selection.Copy
 Windows(Dir(ThisWorkbook.FullName)).Activate
 Worksheets("勤怠シート").Activate
 Cells.Select
 ActiveSheet.Paste


 '2行目からループ:フィールドの1と2の時間合計を3にセット
 iEndRow = ActiveSheet.Range("A65536").End(xlUp).Row
 For iRow = 2 To iEndRow
  時間内労働 = 時分合計(ActiveSheet.Cells(iRow, 1), ActiveSheet.Cells(iRow, 1)) '←ここの「時分合計」が呼び出されない!!
  ActiveSheet.Cells(iRow, 3) = 時間内労働
 Next iRow

End Sub

【18792】Re:functionが呼び出されない!
回答  ichinose  - 04/10/11(月) 19:23 -

引用なし
パスワード
   ともちゃん さん、Asakiさん、こんばんは。

>さっそくのレス、有難うございます。コードはちょっと長いので、遠慮してたんですが、やっぱり見ていただいたほうが良いようなのでアップします。
>とてもへたくそなコードだと思いますが、ご意見お願いします。
>
>
>これは、メニューボタンを貼った、フォームの(シートではない)の関数、及びイベントです。
>
>' 10.5 + 2.10 = 13.0 で計算で計算結果を返す(→意味:10:50+2:10=13:00)
>Private Function 時分合計(ctime1, ctime2)
>Dim 時数1 As Integer
>Dim 時数2 As Integer
>Dim 分数1 As Integer
>Dim 分数2 As Integer
>Dim 計時数 As Integer
>Dim 計分数 As Integer
>
> 時数1 = Int(ctime1) '切捨て
> 時数2 = Int(ctime2) '切捨て
> 分数1 = (ctime1 - 時数1) * 100
> 分数2 = (ctime2 - 時数2) * 100
> 計分数 = 分数1 + 分数2
> 計時数 = 時数1 + 時数2 + ((分数1 + 分数2) \ 60)
> 計分数 = 計分数 - (60 * ((分数1 + 分数2) \ 60))
> 時分合計 = 計時数 + (計分数 / 100)
>
>End Function
>
>
>'データファイルインポート → 計算
>Private Sub BtnInport_Click()
>Dim Ret As Variant
>Dim sFullname As String
>Dim iEndRow As Integer
>Dim iRow As Integer 'ループカウンタ
>Dim 時間内労働
> 
> Application.ScreenUpdating = False
> 'ファイルを指定
> CurDir (ThisWorkbook.Path)
> Ret = Application.GetOpenFilename("CSVファイル(*.csv), *.csv")
> If Ret = False Then
>  Exit Sub 'キャンセル
> End If
> 
> 'パス・ファイル名の取得
> sFullname = Ret
> 'メニュー画面を閉じる
> Unload Me
'  ↑これが問題なのではありませんか?
'  ここでフォームをUnloadしてしまったら・・・、
'  以下のコードが実行されないと思いますが・・・。
'  ここでは、
'  me.hide

> 'CSVファイルを開いて、「勤怠シート」にデータを貼り付け
> Workbooks.Open Filename:=sFullname
> Cells.Select
> Selection.Copy
> Windows(Dir(ThisWorkbook.FullName)).Activate
> Worksheets("勤怠シート").Activate
> Cells.Select
> ActiveSheet.Paste
>
>
> '2行目からループ:フィールドの1と2の時間合計を3にセット
> iEndRow = ActiveSheet.Range("A65536").End(xlUp).Row
> For iRow = 2 To iEndRow
>  時間内労働 = 時分合計(ActiveSheet.Cells(iRow, 1), ActiveSheet.Cells(iRow, 1)) '←ここの「時分合計」が呼び出されない!!
>  ActiveSheet.Cells(iRow, 3) = 時間内労働
> Next iRow
>
'全て処理が終了したら、
  unload me
>End Sub

【18815】Re:functionが呼び出されない!
お礼  ともちゃん  - 04/10/13(水) 10:45 -

引用なし
パスワード
   ご意見有難うございます。Delphiなら多少心得があるのですが、Excel VBAは慣れていないもので、こんな簡単なことが分かりませんでした。UnLoad Meは、画面を閉じるだけだと思っていたのですが、なるほど、こんな働きがあるとは思いませんでした。お恥ずかしい限りです。どうも有難うございました。

10983 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free