【初月無料キャンペーン中】gooドクター

コマンドボタン1を押すとテキストボックスに入力した値をセルへ保存したいです。

ただ、テキストボックス⇒シートへの直通ではなく、テキストボックス→構造体→シートの
ルートでやらなければいけません・・。
現状の書き方だとシート⇒構造体となってしまっているらしく、セルへは保存されません。

出力(SetAttendance)は正常に出来ているので、これと逆の処理をすれば良いとのことなのですが
構造体を介した場合の記述がよく分かりません・・・。

Cells(i + 1, 3).Value = Me.Controls("txtStarttime" & i).Valueにしてみましたが
セルへ入ってもフォームを閉じたり切り替えると消えてしまいます。

※画像でシートのセルに入っている値は直入力したものです。

Type attendance
starttime As Date
endtime As Date
breakstart As Date
breakend As Date
worktime As Single
note As String
End Type

'以下ユーザーフォーム

Private monthly() As attendance '構造体の配列を宣言

Private Sub CommandButton1_Click() '更新ボタン
Call AttendanceSave
Call SetAttendance
End Sub

Public Sub AttendanceSave() '保存
ReDim monthly(1 To 31)

Dim i As Long
For i = 1 To 31
monthly(i).starttime = Cells(i + 1, 3).Value
monthly(i).endtime = Cells(i + 1, 4).Value
monthly(i).breakstart = Cells(i + 1, 5).Value
monthly(i).breakend = Cells(i + 1, 6).Value
monthly(i).worktime = Cells(i + 1, 7).Value   
monthly(i).note = Cells(i + 1, 8).Value
Next i

End Sub

Public Sub SetAttendance() '出力

Dim i As Long
Sheets(cmbMonth.Value).Activate
For i = LBound(monthly) To UBound(monthly)
Me.Controls("txtStarttime" & i).Value = monthly(i).starttime
Me.Controls("txtEndtime" & i).Value = monthly(i).endtime
Me.Controls("txtBreakstart" & i).Value = monthly(i).breakstart
Me.Controls("txtBreakend" & i).Value = monthly(i).breakend
Me.Controls("txtWorktime" & i).Value = monthly(i).worktime
Me.Controls("txtNote" & i).Value = monthly(i).note
Next i

End Sub

Private Sub UserForm_Initialize()

Dim i As Integer

'当年、来年の西暦をリストに設定
For i = 0 To 1
cmbYear.AddItem Year(Date) + i
Next
cmbYear.Value = Year(Date) '当年を初期値に


For i = 1 To 12 'シートは1から12まで
cmbMonth.AddItem i
Next
cmbMonth.Value = Month(Date) '当月を初期値に
'初期値を設定することで cmbMonth_Change が呼び出される

End Sub

Private Sub cmbYear_Change()     '年選択プルダウン
SetWeekLabel

End Sub

Private Sub cmbMonth_Change()      '月選択プルダウン

Debug.Print cmbMonth.Value
Worksheets(cmbMonth.Value).Select '先に月シートを選択してから
'曜日設定やテキストへの転記をする

SetWeekLabel '曜日設定
Call AttendanceSave '選択したシートデータを構造体配列へ
Call SetAttendance '構造体配列からテキストへ

End Sub

「テキストボックスからシートへの暗記」の質問画像
gooドクター

A 回答 (6件)

No.5です。



変数の宣言時の型ですね。
Date型の変数に文字列型であるテキストボックスの値がキチンと入るのか?とちょっと気になったので。
特に日時ではなく時刻のみだと『何年何月何日の‼』とかでどうなるのかな?なんて。

そこをデバッグでどんな値が入っているのかをまず確認でしょうか。
    • good
    • 1

データ型の違う変数にそのまま代入(データ変換してない感じですし)していて問題にはならないですかね。


無論検証してないのでそこは平気でしたらすいません。

ただセルの表示がってのはセルの値がって事を指しているのでしょうか?と疑問はあります。
    • good
    • 1
この回答へのお礼

ありがとうございます・・!

言い回しが不適切ですみません・・!セルの値のことですね・・。

お礼日時:2021/10/20 16:53

No3です



>「12:00:00 AM」となってしまいます。
処理は2段階で、「フォーム」→「構造体」→「シート」となっているはずですよね?
まずは、どちらの処理でおかしくなっているのかを確認して、おかしな方の処理を再確認すれば済む話ではないでしょうか?
途中で、構造体のデータをダンプすれば確認できますよね?
(VBAならウォッチウィンドウで確認するのが簡単です)

処理内容は、どちらもただのデータ転記処理で10行程度のものと想像しますので、単純ミスが紛れているだけの話ではないのでしょうか?
他のデータは正しく転記出来ていて、1項目の時間だけがおかしいのなら、その添え字が変化していないだけの可能性が高いのでは?
(「i」や「l」と「1」のタイポとか・・・)

また、フォームデータの当該時間の値を全部違う値にして実行してみれば、どの値だけが読まれているのか(あるいは、どれも読まれていないのか)などもすぐに確認できるものと思います。


もしも、上記が原因であるならば・・・
わざわざ手間をかけて構造体化しているのですから、日付などの変数も意味を持たない「i」などとせずに、意味のある変数名に統一するなどのルールにしておくことで、可読性は上がるものと想像しますけれど…

※ 当たり前のデバックの手順を長々と書きましたが、
  「そんなのわかってて、とっくにやってるよっ!」
 というのでしたら、大変申し訳ありませんでした。
(記載がない情報は、読み手にはまったくわかりませんので・・・)
    • good
    • 1
この回答へのお礼

ご説明ありがとうございます・・!

お礼日時:2021/10/20 16:54

こんにちは



それだけ大仰にやろうとしているんですから、構造体を作成したら、次には、そのメソッドとしての入出力等を作成してあるのではないでしょうか?
作成してあるのならそれを利用すればよいだけかと。(なければ作成する)

処理の命名規則がどうなっているのかよくわかりませんが、ご提示の範囲で見る限りでは、
・AttendanceSave シート → 構造体
・SetAttendance  構造体 → フォーム
はあるけれど、逆の流れが無いのでそれを持ってくれば(もしくは、無いのなら作成する)良いってことでは?

ところで、もしもフォームがユーザ入力用であるのなら、どこかで入力値のチェックを行っているはずですけれど、その部分は、すでにできているのでしょうか?
UIがからむと、単純な一方通行の処理ではなくなるので、チェックや誤入力時の対応に関する処理は、その機能としてまとめて作成されているものと推測しますけれど・・・?
(逆の流れを処理する前に、チェックが必要になると考えられますので…)

>出力(SetAttendance)は正常に出来ているので、
>これと逆の処理をすれば良いとのことなのですが
なんだか文章に主体性がないですけれど、上司の指示で動いているのなら、わからないことは上司に聞いた方が賢明だし、効率的だと思います。(中途半端な情報で、見ず知らずの他人に質問サイトで質問するよりも)
とは言え、単純に「右辺」と「左辺」を入れ替えれば済む話だとは思いますが。


なんとなくの雰囲気からすると、どうせそこまでなさるのなら、構造体(TYPE)よりもオブジェクト(CLASS)で定義しておいて、関連する処理はオブジェクトのメソッドとして設定してしまう方が、全体的に整理されるような気がします。
(この後からなんやかや出てくると、段々複雑化することが予想されますので‥)
    • good
    • 2
この回答へのお礼

アドバイスいただきありがとうございます!
下記のコメントでも書きましたが、左右入れ替えでは時間表記のセルの部分が全て「12:00:00 AM」となってしまいます。

入力値チェックはここに記載していませんが用意してあります。

お礼日時:2021/10/20 14:18

>出力(SetAttendance)は正常に出来ているので、これと逆の処理をすれば良いとのことなのですが


構造体を介した場合の記述がよく分かりません・・・

代入式の左辺と右辺を入れ替えればいいのでは?
そしてテキストボックス⇒構造体は更新ボタンのクリックイベントに、構造体⇒シートは出力にて行なうとか?
    • good
    • 1
この回答へのお礼

ありがとうございます・・!
代入式の左右入れ替えは既に試したのですが、時間表記のセルの部分が全て「12:00:00 AM」になってしまうんです・・。

お礼日時:2021/10/20 11:08

あなたのPCでしょ?別にあなたのPCだけが一般的とは言えません。



他のやり方があるPCもありますので。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング