Excel VBA質問箱 IV

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

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


4754 / 13644 ツリー ←次へ | 前へ→

【54606】ユーザーフォームでの計算結果の転記 Regina 08/3/24(月) 1:10 質問[未読]
【54608】Re:ユーザーフォームでの計算結果の転記 ichinose 08/3/24(月) 8:45 発言[未読]
【54617】Re:ユーザーフォームでの計算結果の転記 Jaka 08/3/24(月) 16:22 発言[未読]
【54618】Re:ユーザーフォームでの計算結果の転記 VBWASURETA 08/3/24(月) 17:28 質問[未読]
【54619】Re:ユーザーフォームでの計算結果の転記 VBWASURETA 08/3/24(月) 17:53 発言[未読]
【54620】Re:ユーザーフォームでの計算結果の転記 VBWASURETA 08/3/24(月) 18:10 発言[未読]
【54625】ユーザーフォームでの計算結果の転記 Regina 08/3/24(月) 23:25 発言[未読]
【54631】Re:ユーザーフォームでの計算結果の転記 VBWASURETA 08/3/25(火) 9:06 回答[未読]
【54632】Re:ユーザーフォームでの計算結果の転記 VBWASURETA 08/3/25(火) 9:13 発言[未読]
【54673】Re:ユーザーフォームでの計算結果の転記 Regina 08/3/25(火) 21:46 発言[未読]

【54606】ユーザーフォームでの計算結果の転記
質問  Regina  - 08/3/24(月) 1:10 -

引用なし
パスワード
   ユーザーフォームを使用して、顧客(リハビリ患者)リストをワークシートに転記するVBAを作っています。計算をしないといけない項目が数箇所あって、まず、生年月日の計算からコードを作っているところです。計算結果までボタンのクリックでできるようになりましたが、計算結果が、ワークシートに転記できず、「######」と代入されてしまいます。そのほかの、テキストボックスやチェックボックスの内容はきちんと転記されています。生年月日(TextBox3としています)も転記できません。年齢計算の結果はTextBox4に表示されるようにしています。
生年月日と年齢の計算結果をシートに転記できるようにしたいので、教えて下さい。

エクセルは2003でPCはXPです。最近VBAを知ったばかりで、独学状態です。
ご指導宜しくお願いします。

以下、現在まで作っているコードです。

Private Sub UserForm3_Initialize()
Dim チェックボックス As Control
Dim 日 As Date  
 
日 = UserForm3.TextBox3.Text 

TextBox1.Text = ""
TextBox2.Text = ""
TextBox6.Text = ""
TextBox9.Text = ""
TextBox4.Text = "" 
 
OptionButton1.Value = True
OptionButton3.Value = True


For Each チェックボックス In Freme9.Controls
 チェックボックス.Value = False
Next

For Each チェックボックス In Freme10.Controls
 チェックボックス.Value = False
Next


End Sub

Private Sub CommandButton3_Click()  ここからが年齢計算です。
With Me.TextBox3
If Not IsDate(.Value) Then Exit Sub
Me.TextBox4.Value = Application.Evaluate("DATEDIF(""" _
   & CDate(.Value) & """,TODAY(),""Y"")")

End With →ここまでで、歳のTextBox4に年齢の値が計算されていました。
End Sub

Private Sub CommandButton1_Click() →ここからが転記の部分です。
Dim z As Long
Dim 確認 As Integer

確認 = MsgBox("データーを登録します。" & "よろしいですか?", vbYesNo)
If 確認 <> vbYes Then Exit Sub

z = Range("データーベース!A4").CurrentRegion.Rows.Count
Range("データーベース!A" & z + 4).Offset(0, 0).Value = TextBox1.Text
Range("データーベース!A" & z + 4).Offset(0, 1).Value = TextBox2.Text
Range("データーベース!A" & z + 4).Offset(0, 8).Value = TextBox6.Text
Range("データーベース!A" & z + 4).Offset(0, 4).Value = TextBox3.Text
Range("データーベース!A" & z + 4).Offset(0, 7).Value = TextBox9.Text
Range("データーベース!A" & z + 4).Offset(0, 5).Value = TextBox4.Text
 →すぐ上の部分が年齢の値を転記するコードとして入力しています。

If OptionButton1.Value = True Then
  Range("データーベース!A" & z + 4).Offset(0, 2).Value = "男性"
Else
  Range("データーベース!A" & z + 4).Offset(0, 2).Value = "女性"
End If
  
If OptionButton3.Value = True Then
  Range("データーベース!A" & z + 4).Offset(0, 5).Value = "入院"
Else
  Range("データーベース!A" & z + 4).Offset(0, 5).Value = "外来"
End If

If CheckBox1.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "運動器"
If CheckBox2.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "脳血管"
If CheckBox3.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "呼吸器"
If CheckBox4.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "心大血管"
If CheckBox5.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "手技消炎"
If CheckBox6.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "器具消炎"
  
  
If CheckBox9.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 11).Value = "終了"
If CheckBox10.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 11).Value = "中止"
If CheckBox11.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 11).Value = "転院・入所"
If CheckBox12.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 11).Value = "死亡退院"


Unload UserForm3
End Sub

Private Sub CommandButton2_Click()
Unload UserForm3
End Sub

【54608】Re:ユーザーフォームでの計算結果の転記
発言  ichinose  - 08/3/24(月) 8:45 -

引用なし
パスワード
   ▼Regina さん:
おはようございます。

ざっと見たところですが・・・、

>ユーザーフォームを使用して、顧客(リハビリ患者)リストをワークシートに転記するVBAを作っています。計算をしないといけない項目が数箇所あって、まず、生年月日の計算からコードを作っているところです。計算結果までボタンのクリックでできるようになりましたが、計算結果が、ワークシートに転記できず、「######」と代入されてしまいます。

####・・と表示される場合は、

1.対象セルの幅が日付を全部表示するには、狭すぎる場合

2.対象セルが日付の書式に設定されている場合、
日付として認識できない数値が入力された場合 

が考えられます。

1.の場合は、セルの幅を広げてみると、日付が表示されます。

2.の場合は、入力データが日付として認識できない場合が考えられます。

この辺りを再度、確認してみてください。


そのほかの、テキストボックスやチェックボックスの内容はきちんと転記されています。生年月日(TextBox3としています)も転記できません。年齢計算の結果はTextBox4に表示されるようにしています。
生年月日と年齢の計算結果をシートに転記できるようにしたいので、教えて下さい。

年齢を保存用シートに入力する意味はないと思いますよ!!

御自分で計算されているように、年齢は、生年月日と本日の日付からその都度計算して表示(印刷等)すればよいのです。
この結果を保存用シートに設定するメリットが見出せません。

もし、保存用シート(ここではデーターベースというシート名ですか)が表示にも印刷にも兼用で使うなら、Evaluateで使った数式(DATEDIF・・・)を入力したほうが良いと
思いますけどねえ!!


提示されたコードは、何らかの説明がないとそのままでは
この掲示板を見ている方は、コードを解析しないと
作動させることができません。

ユーザーフォームには、どんなコントロールを配置し、
シート名にはどんなシート名が命名されているとか、
他にも対象シートの書式設定の説明も必要です。

コードはどのモジュールに記述している等の情報も本来は必要です。

又、コードを作動させてどのような手順で操作すると、不具合が再現できるか
という手順書も必要です。

結構大変ですが、不具合を早く発見するには、
不可欠なんですよ!!

検討してみてください。

【54617】Re:ユーザーフォームでの計算結果の転記
発言  Jaka  - 08/3/24(月) 16:22 -

引用なし
パスワード
   >Me.TextBox4.Value = Application.Evaluate("DATEDIF(""" _
>   & CDate(.Value) & """,TODAY(),""Y"")")

>End With →ここまでで、歳のTextBox4に年齢の値が計算されていました。
>End Sub

う〜ん。
いまいち、CDate(.Value)の意味が解らないんですけど???
なぜ、日付に戻す必要があるのでしょうか?
このセルは、文字列だからわざわざ日付の直しているのでしょうか?

どんな風に入力されているのかわからないけど、
CDate(.Value)
だとまずいと思いますよ。

たとえば、

Sub だめ1()
  Range("A1").NumberFormatLocal = "G/標準"
  Range("A1") = "2006/2/9"
  MsgBox Application.Evaluate("DATEDIF(""" _
   & Range("A1").Value & """,TODAY(),""Y"")")
End Sub

Sub だめ2()
  Range("A2").NumberFormatLocal = "@"
  Range("A2") = "2006/2/9"
  MsgBox Application.Evaluate("DATEDIF(""" _
   & CDate(Range("A2").Value) & """,TODAY(),""Y"")")
End Sub

Sub OK1()
  Range("A1").NumberFormatLocal = "G/標準"
  Range("A1") = "2006/2/9"
  MsgBox Application.Evaluate("DATEDIF(""" _
   & Format(Range("A1").Value, "yyyy/m/d") & """,TODAY(),""Y"")")
End Sub

Sub OK2()
  Range("A2").NumberFormatLocal = "@"
  Range("A2") = "2006/2/9"
  MsgBox Application.Evaluate("DATEDIF(""" _
   & Range("A2").Value & """,TODAY(),""Y"")")
End Sub

それとね。
Date型の変数は、コントロールパネルの地域オプションの
短い方の設定に応じて結果が変わるから注意した方が良いです。
場合によってアメ交方式で扱われるからこれも注意。
西暦は、きちんと4桁で。
下記で望みの結果が返ります?

Dim ddn As Date
ddn = Date
MsgBox ddn

【54618】Re:ユーザーフォームでの計算結果の転記
質問  VBWASURETA  - 08/3/24(月) 17:28 -

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

ちょっと気になったのはjakaさんと同じ箇所ですが、
UserForm3という名前のフォームのテキスト3の内容が日付のデータだった場合に
DATEDIF関数で年の差をテキスト4に入れてますが、テキスト4には
ちゃんと取れてますか?後、テキスト3にはどいう日付が入ってますか?

【54619】Re:ユーザーフォームでの計算結果の転記
発言  VBWASURETA  - 08/3/24(月) 17:53 -

引用なし
パスワード
   すみません質問と関係ないですがもう一点気になりました。


>Range("データーベース!A" & z + 4).Offset(0, 5).Value = TextBox4.Text

ここと

>If OptionButton3.Value = True Then
>  Range("データーベース!A" & z + 4).Offset(0, 5).Value = "入院"
>Else
>  Range("データーベース!A" & z + 4).Offset(0, 5).Value = "外来"
>End If


ここですが
同じ箇所に書いてますけど上書きされても良いのでしょうか?

【54620】Re:ユーザーフォームでの計算結果の転記
発言  VBWASURETA  - 08/3/24(月) 18:10 -

引用なし
パスワード
   ▼Jaka さん:
ちょっとさっき書いたのですが多分シートの日付型というより
フォームで入力している日付がどいう入力なのかが問題じゃないかなと思います。

【54625】ユーザーフォームでの計算結果の転記
発言  Regina  - 08/3/24(月) 23:25 -

引用なし
パスワード
   焦っていたので、詳しい内容を記載しておりませんでした。すみません。
ワークシート名:データーベース
   入力データー名:患者ID
           氏名
           性別
           生年月日
           年齢
           入院・外来
           発症日・起算日
           主治医・処方医
           診断名
           種別
           算定期限
           転機
    登録ボタン:クリックするとデーター入力用のユーザーフォームを表示
          (ユーザーフォーム名:UserForm3)

UserForm3:
 患者ID→TextBox1 氏名→TextBOx2 
 性別→Frame8内に「男」はOptionButton1、「女」はOptionButton2
 生年月日→TextBox3 年齢→TextBox4 
 入院・外来→Frame2内に「入院」はOptionButton3、「外来」はOptionButton4
 入院日→TextBox5 診断名→TextBox6 主治医・処方医→TextBox9
 種別→Frame9内に CheckBox1〜CheckBox8まで
 発症日・起算日→TextBox7 算定期限日→TextBox8
 転機→Frame10内にCheckBox9〜CheckBox12
 登録ボタン→CommandButton1  キャンセルボタン→CommandButton2

UserForm3で入力した内容を、データーベースと名づけたワークシートに転記しようとしています。データーベースの最後の行に追加していく形で登録していくように設定しています。UserForm3の内容の生年月日・年齢は設定しているのですが、転機できません。「入院日」「発症日・起算日」「算定期限日」はまだ設定できていません。「入院日」「発症日・起算日」はそれぞれ日付を入力する予定です。「算定期限日」は「発症日・起算日」より所定の数字を足した日付が表示されるようにしたいと思っています。UserForm3内で、チェックボックスやオプションボタン、登録ボタン、キャンセルボタンの動作は正常に行われています。
また、ワークシートのデーターベース上の登録ボタンも正常に行われています。

UserForm3での「生年月日→TextBox3」ではS(昭和)・T(大正)などで表示・入力したいのですが、設定が分からず、1978/7/28 という入力方式になっています。「年齢→TextBox4」は CommandButton3をクリックすることで、 「生年月日→TextBox3」から現在の年齢を計算して表示するところまで出来ています。
ただ、 「生年月日→TextBox3」も。「年齢→TextBox4」も、ワークシートのデーターベースに転記できていません。「生年月日→TextBox3」の転記は空白になっており、「年齢→TextBox4」の転記は######となっています。

以下がコード現在までに作ったコードになっております。

Private Sub UserForm3_Initialize()
Dim チェックボックス As Control
Dim 日
 
日 = Format(TextBox3, "yyyy/m/d")

TextBox1.Text = ""
TextBox2.Text = ""
TextBox6.Text = ""
TextBox9.Text = ""
 
OptionButton1.Value = True
OptionButton3.Value = True


For Each チェックボックス In Freme9.Controls
 チェックボックス.Value = False
Next

For Each チェックボックス In Freme10.Controls
 チェックボックス.Value = False
Next


End Sub
Private Sub CommandButton3_Click()
With Me.TextBox3
If Not IsDate(.Value) Then Exit Sub
Me.TextBox4.Value = Application.Evaluate("DATEDIF(""" _
   & CDate(.Value) & """,TODAY(),""Y"")")

End With
End Sub
Private Sub CommandButton1_Click()
Dim z As Long
Dim 確認 As Integer

確認 = MsgBox("データーを登録します。" & "よろしいですか?", vbYesNo)
If 確認 <> vbYes Then Exit Sub

z = Range("データーベース!A4").CurrentRegion.Rows.Count
Range("データーベース!A" & z + 4).Offset(0, 0).Value = TextBox1.Text
Range("データーベース!A" & z + 4).Offset(0, 1).Value = TextBox2.Text
Range("データーベース!A" & z + 4).Offset(0, 8).Value = TextBox6.Text
Range("データーベース!A" & z + 4).Offset(0, 4).Value = 日
Range("データーベース!A" & z + 4).Offset(0, 5).Value = TextBox4.Text
Range("データーベース!A" & z + 4).Offset(0, 7).Value = TextBox9.Text

If OptionButton1.Value = True Then
  Range("データーベース!A" & z + 4).Offset(0, 2).Value = "男性"
Else
  Range("データーベース!A" & z + 4).Offset(0, 2).Value = "女性"
End If
  
If OptionButton3.Value = True Then
  Range("データーベース!A" & z + 4).Offset(0, 5).Value = "入院"
Else
  Range("データーベース!A" & z + 4).Offset(0, 5).Value = "外来"
End If

If CheckBox1.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "運動器"
If CheckBox2.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "脳血管"
If CheckBox3.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "呼吸器"
If CheckBox4.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "心大血管"
If CheckBox5.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "手技消炎"
If CheckBox6.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 9).Value = "器具消炎"
  
  
If CheckBox9.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 11).Value = "終了"
If CheckBox10.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 11).Value = "中止"
If CheckBox11.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 11).Value = "転院・入所"
If CheckBox12.Value = True Then _
  Range("データーベース!A" & z + 4).Offset(0, 11).Value = "死亡退院"


Unload UserForm3
End Sub

Private Sub CommandButton2_Click()
Unload UserForm3
End Sub


Private Sub UserForm_Click()

End Sub
   

【54631】Re:ユーザーフォームでの計算結果の転記
回答  VBWASURETA  - 08/3/25(火) 9:06 -

引用なし
パスワード
   皆さんおはようございます。

じゃ、質問の一部だったみたいですね。
以下のレス見ました?

//www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=54619;id=excel

転記できていないのではなく、一部書き込み場所が同じで
上書きされているだけです。

【54632】Re:ユーザーフォームでの計算結果の転記
発言  VBWASURETA  - 08/3/25(火) 9:13 -

引用なし
パスワード
   追記です。
TextBox3に関しては、年齢算出できているのなら
Ichinoseさんの回答で解決しそうですよ。

【54673】Re:ユーザーフォームでの計算結果の転記
発言  Regina  - 08/3/25(火) 21:46 -

引用なし
パスワード
   ▼VBWASURETA さん:
上書きしてしまうコードを作っていることに気がつきませんでした。転記先が同じになっていました。テキスト3にはyyyy/m/ddの形式で入力しています。
 Dim 日 As Date  →日付の宣言
 日 = DateValue(TextBox3)→テキスト3の文字形式を日付形式にする
 Range("データーベース!A" & z + 4).Offset(0, 3).Value = TextBox3.Text
  →ワークシート(名:データーベース)への転記

 上記を生年月日を入力しているテキスト3に関するコードと直しました。
 TextBox3に 1978/7/28 と入力すると、データーベースには昭和53年7月28日と 転記されていました。年齢も 29 とデーターベースに転記されていました。

 「算定期限日」は「発症日・起算日」より所定の数字を足した日付が表示されるようにしたいと思ってまして、コマンドボタンにより設定できました。

 西暦を和暦に変えたり、和暦を西暦に変えたりすることも、必要になってます。
 一番いいのは、テキスト3に和暦で入力して、年齢計算するのが良いです。
 患者さんの処方箋には生年月日は和暦で入力されています。

 S53.7.28 と入力して年齢が出るようになるために、Format関数を使えるようになるように、今調べ中です。

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