Excel VBA質問箱 IV

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

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


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

【54250】転記元シートの値とユーザーフォームで取得の値を、転記先シートに転記する... にしもり 08/3/2(日) 14:19 質問[未読]
【54251】Re:転記元シートの値とユーザーフォームで... かみちゃん 08/3/2(日) 14:23 発言[未読]
【54252】Re:転記元シートの値とユーザーフォームで... にしもり 08/3/2(日) 14:57 質問[未読]
【54254】Re:転記元シートの値とユーザーフォームで... かみちゃん 08/3/2(日) 15:05 発言[未読]
【54255】Re:転記元シートの値とユーザーフォームで... にしもり 08/3/2(日) 15:15 質問[未読]
【54256】Re:転記元シートの値とユーザーフォームで... かみちゃん 08/3/2(日) 15:29 発言[未読]
【54257】Re:転記元シートの値とユーザーフォームで... にしもり 08/3/2(日) 15:42 質問[未読]
【54258】Re:転記元シートの値とユーザーフォームで... かみちゃん 08/3/2(日) 15:51 発言[未読]
【54259】Re:転記元シートの値とユーザーフォームで... にしもり 08/3/2(日) 16:09 質問[未読]
【54261】Re:転記元シートの値とユーザーフォームで... かみちゃん 08/3/2(日) 16:16 発言[未読]
【54263】Re:転記元シートの値とユーザーフォームで... かみちゃん 08/3/2(日) 16:26 発言[未読]
【54265】Re:転記元シートの値とユーザーフォームで... にしもり 08/3/2(日) 16:38 お礼[未読]
【54267】Re:転記元シートの値とユーザーフォームで... かみちゃん 08/3/2(日) 16:50 発言[未読]
【54269】Re:転記元シートの値とユーザーフォームで... にしもり 08/3/2(日) 17:18 質問[未読]
【54271】Re:転記元シートの値とユーザーフォームで... かみちゃん 08/3/2(日) 17:25 発言[未読]
【54273】Re:転記元シートの値とユーザーフォームで... にしもり 08/3/2(日) 17:31 お礼[未読]

【54250】転記元シートの値とユーザーフォームで取...
質問  にしもり  - 08/3/2(日) 14:19 -

引用なし
パスワード
   転記元シートoverviewのB列の値を、転記先historyの空白行を見つけて転記し(1)、ひきつづいてユーザーフォームのカレンダーから選んだ日付を、同じhistoryの、(1)で作業中の行の別の列へ転記したいのです。
変数は標準モジュール、ユーザーフォームの両方で使えるよう宣言セクションで宣言しました。
下記のような感じてよいでしょうか。
また、ワークシートモジュールでいうところのBeforeDouleClickイベントを、標準モジュールでやるのはどうしたらいいですか。
すみません、基本的なことがわかっていないと思います。


(標準モジュール)

Option Explicit
Dim Cnm As String
Dim Pnm As String
Dim Mnm As String
Dim Tnm As String
Public ws1 As Worksheet
Public i As Long


Sub Test1(ByVal Target As Range, Cancel As Boolean) 
  Activate.Worksheet("overview")
  
  If Not Application.Intersect(Range("B3:B100"), Target) Is Nothing Then
  
    With Target
      Cnm = .Offset(, -1).Value
      Pnm = .Offset(0, 0).Value
      Mnm = .Offset(, 3).Value
      Tnm = .Offset(, 5).Value
    End With
  
    Set ws1 = Worksheets("history")
    For i = 5 To ws1.Range("B65535").End(xlDown).Row
      If IsEmpty(ws1.Cells(i, 2).Value) Then
        ws1.Cells(i, 2).Value = Cnm
        ws1.Cells(i, 3).Value = Pnm
        ws1.Cells(i, 4).Value = Mnm
        ws1.Cells(i, 9).Value = Tnm
        
        UserForm1.Show
              
        Exit For
      End If
    Next i
    
    Cancel = True
 
  End If

End Sub


(ユーザーフォーム)

Option Explicit
Private Sub UserForm_Initialize()
  Calendar1.Value = Date
  カレンダーの日付をセルにセットする
End Sub

Private Sub Calendar1_Click()
  TextBox1.Value = Calendar1.Value
  カレンダーの日付をセルにセットする
End Sub

Private Sub カレンダーの日付をセルにセットする()
  ws1.Cells(i, 5).Value = Calendar1.Value
End Sub

Private Sub CommandButton1_Click()
  Unload UserForm1
End Sub

Private Sub UserForm_Deactivate()
  Unload UserForm1
End Sub

【54251】Re:転記元シートの値とユーザーフォーム...
発言  かみちゃん  - 08/3/2(日) 14:23 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>また、ワークシートモジュールでいうところのBeforeDouleClickイベントを、標準モジュールでやるのはどうしたらいいですか。

以下のマクロをどのように起動したいのですか?
ダブルクリックで起動したいのですか?

Sub MacroStart()
 MsgBox "マクロ処理を開始します" & vbCrLf & _
  "現在のアクティブセルは " & ActiveCell.Address & vbCrLf & _
  "現在の選択範囲は " & Selection.Address
End Sub

【54252】Re:転記元シートの値とユーザーフォーム...
質問  にしもり  - 08/3/2(日) 14:57 -

引用なし
パスワード
   ▼かみちゃん さん:
>こんにちは。かみちゃん です。
>
>>また、ワークシートモジュールでいうところのBeforeDouleClickイベントを、標準モジュールでやるのはどうしたらいいですか。
>
>以下のマクロをどのように起動したいのですか?
>ダブルクリックで起動したいのですか?
>
>Sub MacroStart()
> MsgBox "マクロ処理を開始します" & vbCrLf & _
>  "現在のアクティブセルは " & ActiveCell.Address & vbCrLf & _
>  "現在の選択範囲は " & Selection.Address
>End Sub


質問に対してきかくにこたえてるか、すみません。
したいことはこうです。

overviewというシートがある。

          a列       b列     e列          g列
3行目 Category_a program_a manual_a Teacher_a
4行目 Category_b program_b manual_b Teacher_b
5行目 Category_c program_c manual_c Teacher_c
6行目 Category_d program_d manual_d Teacher_d
 
いまたとえばb3をダブルクリックするとCategory_a がCnmに、program_aがPnmに、manual_aがMnmに Teacher_aがTnmを経て、ws1すなわちhistoryに転記されるようにしたい、
ひきつづきユーザーフォームが表出され(そこには市販本からコピーしたカレンダーがあります)、使用者が選んだ日付がws1すなわちhistoryに転記されるようにしたい。
たとえばb4をダブルクリックするとCategory_b がCnmに、program_bがPnmに、manual_bがMnmに Teacher_bがTnmを経て、ws1すなわちhistoryに転記される、、、という具合です。


なお前のスレッドで一番最初質問した下記は、途中から聞くのをやめています。すみません。

Dateをyyyy/mm/ddで入力したい  ←ユーザーフォームに市販本のカレンダーをつかったことで解決しそう
Time(From)をhh:mm(15分単位)でプルダウンで選びたい ←ユーザーフォームにプルダウンをつかうことで解決しそう
Time(To)をhh:mm(15分単位)でプルダウンで選びたい ←ユーザーフォームにプルダウンをつかうことで解決しそう
Placeを任意の文字列で入力したい ←ユーザーフォームのテキストボックスをつかうことで解決しそう
Notesを任意の文字列で入力したい ←ユーザーフォームのテキストボックスをつかうことで解決しそう
Hoursは、たとえばTime(From)が09:15で、Time(To)が10:00なら、0.75としたい ←ハチさんのアドバイスで解決しそう
そしてsaveするとき、作業当日の日付けをシートhistoryのセルk3に書き込みたい ←ハチさんのアドバイスで解決しそう


わかりづらくてすみません。

【54254】Re:転記元シートの値とユーザーフォーム...
発言  かみちゃん  - 08/3/2(日) 15:05 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>>また、ワークシートモジュールでいうところのBeforeDouleClickイベントを、標準モジュールでやるのはどうしたらいいですか。
>>
>>以下のマクロをどのように起動したいのですか?
>>ダブルクリックで起動したいのですか?
>>
>>Sub MacroStart()
>> MsgBox "マクロ処理を開始します" & vbCrLf & _
>>  "現在のアクティブセルは " & ActiveCell.Address & vbCrLf & _
>>  "現在の選択範囲は " & Selection.Address
>>End Sub
>
>
>質問に対してきかくにこたえてるか、すみません。

答えられていないようなので、聞き方を変えます。

>>>また、ワークシートモジュールでいうところのBeforeDouleClickイベントを、標準モジュールでやるのはどうしたらいいですか。

BeforeDouleClickイベントと同等のことをどのように実行しようとしていますか?
つまり、そのままでは実行できないということに気づいていただきたいのです。

>したいことはこうです。

内容は、理解できました。
問題は、標準モジュールに記述したマクロをどのように実行したいのかということです。

お急ぎのご様子は、よくわかりますが、回り道しても、よく考えてみてください。
さきほど、私が提示したマクロを試してみましたか?

【54255】Re:転記元シートの値とユーザーフォーム...
質問  にしもり  - 08/3/2(日) 15:15 -

引用なし
パスワード
   ▼かみちゃん さん:

>さきほど、私が提示したマクロを試してみましたか?
ご提示いただいたマクロは実施しました。
が、そもそも「BeforeDouleClickイベントと同等のことをどのように実行するべきなのか」が判断できません。シートモジュールでできることであっても標準モジュールではできない(むずかしい)ということはあるのですね?
100%同等でなくても、たとえばスタートボタンで開始してもよいです。

【54256】Re:転記元シートの値とユーザーフォーム...
発言  かみちゃん  - 08/3/2(日) 15:29 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>さきほど、私が提示したマクロを試してみましたか?
>ご提示いただいたマクロは実施しました。

であれば、そういうことしたいのではないでしょうか?
BeforeDouleClickイベント内の変数Targetが、標準モジュールでは、
ActiveCellなどになっていることがおわかりになりませんでしたか?

>そもそも「BeforeDouleClickイベントと同等のことをどのように実行するべきな
>のか」が判断できません。

そうですね。まったく、別ものですから。

> シートモジュールでできることであっても標準モジュールではできない(むずか
> しい)ということはあるのですね?

できないとか、難しいではなく、別ものかと思います。

>100%同等でなくても、たとえばスタートボタンで開始してもよいです。

スタートボタンで開始するときに、セル位置はどこにあるのでしょうか?
たとえば、以下のようなマクロを実行するとどうなりますか?

Sub Sample()
 Dim Cnm As String
 Dim Pnm As String
 Dim Mnm As String
 Dim Tnm As String
' Dim ws1 As Worksheet
' Dim i As Long
 
' If Not Application.Intersect(Range("B3:B100"), Target) Is Nothing Then
'  With Target
  With ActiveCell
   Cnm = .Offset(, -1).Value
   Pnm = .Offset(0, 0).Value
   Mnm = .Offset(, 3).Value
   Tnm = .Offset(, 5).Value
  End With
  Set ws1 = Worksheets("history")
  For i = 5 To ws1.Range("B65535").End(xlDown).Row
   If IsEmpty(ws1.Cells(i, 2).Value) Then
    ws1.Cells(i, 2).Value = Cnm
    ws1.Cells(i, 3).Value = Pnm
    ws1.Cells(i, 4).Value = Mnm
    ws1.Cells(i, 9).Value = Tnm
    
    UserForm1.Show
       
    Exit For
   End If
  Next i
'  Cancel = True
' End If
End Sub

【54257】Re:転記元シートの値とユーザーフォーム...
質問  にしもり  - 08/3/2(日) 15:42 -

引用なし
パスワード
   ▼かみちゃん さん:
>BeforeDouleClickイベント内の変数Targetが、標準モジュールでは、
>ActiveCellなどになっていることがおわかりになりませんでしたか?
たしかに$D$3とかになっていました。ActiveCellとおっしゃっているのはポイントしてるセルのことですね。

>スタートボタンで開始するときに、セル位置はどこにあるのでしょうか?
転記したい行のB列をポイントしてマクロをスタートすればよい、ということですね?

【54258】Re:転記元シートの値とユーザーフォーム...
発言  かみちゃん  - 08/3/2(日) 15:51 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>BeforeDouleClickイベント内の変数Targetが、標準モジュールでは、
>>ActiveCellなどになっていることがおわかりになりませんでしたか?
>たしかに$D$3とかになっていました。ActiveCellとおっしゃっているのはポイントしてるセルのことですね。

そうです。
Selectionとの違いは、複数セル範囲を選択してマクロを開始した場合どうするか
を確認しておいてください。

>>スタートボタンで開始するときに、セル位置はどこにあるのでしょうか?
>転記したい行のB列をポイントしてマクロをスタートすればよい、ということですね?

そうです。そのためのコードを[54256]で提示しています。

以下のように特定のセル範囲に限定してもいいかもしれませんね。

 If Not Application.Intersect(Range("B3:B100"), ActiveCell) Is Nothing Then
  With ActiveCell

   '〜処理〜

  Next
 Else
  MsgBox "B3〜B100のセルをアクティブにしてください。"
 End If

【54259】Re:転記元シートの値とユーザーフォーム...
質問  にしもり  - 08/3/2(日) 16:09 -

引用なし
パスワード
   ▼かみちゃん さん:
ありがとうございます。
シートモジュールと標準モジュールが別物とすこしずつ理解できてきました。

アドバイスにしたがい、範囲を限定しました。
これでMsgがでるので使用者は間違ったら気づくとおもいます。

すこし進めてみました。
1、ユーザーフォームでも使用する、ws1とiを宣言セクションで宣言し
2、UserForm1.Showを非コメント化し
3、マクロを実行した

そうしたらユーザーフォームのモジュールのiがポイントされ、「変数が定義されてない」と出ます。
宣言のしかたが悪いでしょうか?

(標準モジュール)
Option Explicit
 Dim ws1 As Worksheet
 Dim i As Long
 
Sub Sample()
 Dim Cnm As String
 Dim Pnm As String
 Dim Mnm As String
 Dim Tnm As String
 
  If Not Application.Intersect(Range("B3:B100"), ActiveCell) Is Nothing Then
  With ActiveCell
    Cnm = .Offset(, -1).Value
    Pnm = .Offset(0, 0).Value
    Mnm = .Offset(, 3).Value
    Tnm = .Offset(, 5).Value
  End With
  
  Set ws1 = Worksheets("history")
  
  For i = 5 To ws1.Range("B65535").End(xlDown).Row
   If IsEmpty(ws1.Cells(i, 2).Value) Then
    ws1.Cells(i, 2).Value = Cnm
    ws1.Cells(i, 3).Value = Pnm
    ws1.Cells(i, 4).Value = Mnm
    ws1.Cells(i, 9).Value = Tnm
  
    UserForm1.Show
    
    Exit For
   End If
  Next i
  
  Else
  
  MsgBox "B3〜B100のセルをアクティブにしてください。"
  
  End If
 
 '  Cancel = True

End Sub


(ユーザーフォーム)
Option Explicit
Private Sub UserForm_Initialize()
  Calendar1.Value = Date
  カレンダーの日付をセルにセットする
End Sub

Private Sub Calendar1_Click()
  TextBox1.Value = Calendar1.Value
  カレンダーの日付をセルにセットする
End Sub

Private Sub カレンダーの日付をセルにセットする()
  ws1.Cells(i, 5).Value = Calendar1.Value ←ここでひっかかる
End Sub

Private Sub CommandButton1_Click()
  Unload UserForm1
End Sub

Private Sub UserForm_Deactivate()
  Unload UserForm1
End Sub

【54261】Re:転記元シートの値とユーザーフォーム...
発言  かみちゃん  - 08/3/2(日) 16:16 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ユーザーフォームのモジュールのiがポイントされ、「変数が定義されてない」と出ます。
>宣言のしかたが悪いでしょうか?

[54256]での標準モジュールの変数の宣言との違いです。
よく確認して、なぜ、そのような宣言の仕方に「変えた」のかを考えてください。
誰も、そのような宣言方法にしてください、と説明していないはずです。

【54263】Re:転記元シートの値とユーザーフォーム...
発言  かみちゃん  - 08/3/2(日) 16:26 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>なお前のスレッドで一番最初質問した下記は、途中から聞くのをやめています。

以下のスレッドのことかと思いますが、
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=54189;id=excel
さきほど、イベントのコードを標準モジュールにするとコードは、どうしたらいいか
をコメントさせていただきました。

自己解決されるのは、いいのですが、解決結果を差し支えない範囲で提示するようにしましょう。
そのようにすることで、みなさんと情報共有ができますし、にしもりさんがどこまで
理解できたかがわかると思います。

【54265】Re:転記元シートの値とユーザーフォーム...
お礼  にしもり  - 08/3/2(日) 16:38 -

引用なし
パスワード
   ▼かみちゃん さん:
ありがとうございました。
わかりました。おっしゃるとおりと存じます。

【54267】Re:転記元シートの値とユーザーフォーム...
発言  かみちゃん  - 08/3/2(日) 16:50 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>ありがとうございました。
>わかりました。おっしゃるとおりと存じます。

で、[54261]のコメントは、ご理解いただけたのでしょうか?
そういうことが、わからないから、自己解決したならば、どのように解決したのか説明してほしいというお願いをしているのです。
コメントをもらってそのとおりにしたら、できたのかできていないのか、が大事です。
「ありがとうございました」では、できたかできていないのかはわかりません。

ただ、「思い通り動いた」(できた)、と、「理解できた」では、意味が大きく違います。
最終的に大事なのは、後者なのですが、前者の説明も大事だと思います。

【54269】Re:転記元シートの値とユーザーフォーム...
質問  にしもり  - 08/3/2(日) 17:18 -

引用なし
パスワード
   ▼かみちゃん さん:
失礼しました。
こちらで止まった原因は、
Public ws1 As Worksheet
Public i As Long
と記述すべきところ
Dim ws1 As Worksheet
Dim i As Long
で宣言したからだとおもいます。
同一プロジェクト内で使う変数を宣言セクションで定義する場合にPublicを用いると理解しましたが、宜しいでしょうか。

【54271】Re:転記元シートの値とユーザーフォーム...
発言  かみちゃん  - 08/3/2(日) 17:25 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>こちらで止まった原因は、
>Public ws1 As Worksheet
>Public i As Long
>と記述すべきところ
>Dim ws1 As Worksheet
>Dim i As Long
>で宣言したからだとおもいます。
>同一プロジェクト内で使う変数を宣言セクションで定義する場合にPublicを用いると理解しました

詳しくは、ヘルプの「Publicステートメント」を確認していただければいいのですが、
概ねそういう理解でいいのではないでしょうか?
微妙に表現の使い方の違いで、断言はできませんが、今回の場合は、

ws1 と i が標準モジュールまたはシートモジュールとUserFormモジュールで、
使いまわしされていますよね?

そういうときには、私は、
Public 〜
と標準モジュールで宣言するようにしています。

【54273】Re:転記元シートの値とユーザーフォーム...
お礼  にしもり  - 08/3/2(日) 17:31 -

引用なし
パスワード
   ▼かみちゃん さん:
ありがとうございました。

もう一方のスレッドですが、
'Date
ws1.Cells(i,5).Value = Me.TextBox1.Value
の箇所を、市販本のカレンダーを利用しますので変えます。
(数分後というわけにはいきませんが、結果はお伝えしたいと思っております。)

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