プロが教える店舗&オフィスのセキュリティ対策術

現在会社のシステムで日報を入力させるユーザーフォームをExcel VBAで作成しています。

ユーザーフォームから登録ボタンを押して、
一覧のシートに転記するところまでは出来たのですが
間違えて入力したとき(又は一時保存して再度途中から入力したいとき)
再度日付をキーにしてデータを元のユーザーフォームに呼び出し、
上書き保存ができるようにしたいとのことで指示がありました。

現在は下記のような形で日付(+その他必須項目)が入力されていさえすれば
新しいデータは次の行に登録されていくようになっているのですが、
現在はITの会社でもなく私自身ほぼネットの情報から見様見真似でやっているので
どうしたらよいかわからず、手が止まってしまいました。

専門用語もあまりわからないような状態で申し訳ないのですが、
どなたか教えていただけると助かります…宜しくお願いします。

----------------------------------------------------------------------------------------
 ’登録ボタンを押した時の動作

Private Sub CommandButton1_Click()

 ’必須項目未入力時のエラーメッセージ 
 
If TextBox295.Value = "" Then
MsgBox "日付を入力してください!", vbOKOnly
TextBox295.SetFocus
Exit Sub
:
:
Else: MsgBox "登録が完了しました。"
End If

   
 ’ ””入力””シートに下記のデータを転記する

With Worksheets("入力").Cells(Rows.Count, 1).End(xlUp)

.Offset(1, 0) = TextBox295.Value '日付をA列に入れる
.Offset(1, 9) = ComboBox1.Value '天気をJ列に入れる
          :
          :
    End with
End sub
----------------------------------------------------------------------------------------

質問者からの補足コメント

  • 【追記】わかりにくくてすみません…
    シートの構成は、
    ・「登録」(フォームボタンのシート)
    ・「閲覧フォーマット」(データを日ごとに見るためのシート)
    ・「入力」(フォームで登録したデータを蓄積していくシート)
    の3つです。

      補足日時:2018/07/09 16:49

A 回答 (3件)

見様見真似とはいえ、


・「登録」(フォームボタンのシート)
・「閲覧フォーマット」(データを日ごとに見るためのシート)
・「入力」(フォームで登録したデータを蓄積していくシート)
はご自分で作成されたのであれば、アドバイス程度を・・・

「ユーザーフォーム」に「読込(等、表示内容はご自由に!)」のCommandButtonを追加し、以下の操作を加えればよい。
1.日付(TextBox295に入力済)をキーに「入力」シートに記載されている行を検索・特定する。
※「データ既存行」としておきます。No2さんも回答していますが、「Find」が一般的。
しかし、「閲覧フォーマット」(データを日ごとに見るためのシート)がある以上、そのアルゴリズムはほとんどできているはずです。

2.その行の情報を「ユーザーフォーム」に表示する。
※そのセルをもとに各コントロールに内容を入力する。

TextBox295.Value =.Offset(1, 0) 'A列の値を日付表示用に入れる
ComboBox1.Value=.Offset(1, 9) 'J列の値を天気表示用に入れる
          :
          :
--------------「ユーザーフォーム」に表示するための変更はここまでーーーーーーーーー
次に「登録操作の変更点」

・登録ボタンで、入力されてた内容をその行に書き込む
ほとんど既存の「登録ボタン」と同じ内容ですが、
「新規の登録」なのか「既存データの変更・追加」なのかによって
「With Worksheets("入力").Cells(Rows.Count, 1).End(xlUp)」

「With Worksheets("入力").Cells(データ既存行, 1).End(xlUp)」
を使い分ける必要が出てきます。

以上、参考にして下さい。
    • good
    • 1
この回答へのお礼

ご丁寧にありがとうございます。転記の方法については、
単純に転記元と転記先を入れ替えればよかったんですね!
そのあたりは簡単にできそうですが、Findを使う方法については
まだ少しよくわかっていない部分がありますので、書き方を他でも探してみます。

※閲覧フォーマットへの転記については、データを蓄積していく「入力」のシートから
単純にVLOOKUPでこちらも日付をキーにして入力させるようにしてしまいましたので
考え方は同じだと思うのですが、初めは検索ができない形式でも問題ないとの指示だったため、
閲覧用の方は、VLOOKであれば…と思い先に作成してしまったのですが、結果
フォームにも該当するデータを転記せざるを得なくなり、今VBAでやっています。

お礼日時:2018/07/11 13:19

No.1です。



>・「閲覧フォーマット」(データを日ごとに見るためのシート)
>・「入力」(フォームで登録したデータを蓄積していくシート)

さて問題です。
「入力」シートのある1行のセルには、ユーザーフォームのどのコントロールから登録したのか?をどうやったら回答者はわかるでしょうか?
そもそもユーザーフォームにはどの位のコントロールが使われているのかも不明ですよね。

考え方だけで良ければ日付をFindメソッドで検索し、見つかったらOffsetでそれぞれのコントロールに値を入れていくと言う、
「登録」とは逆の動きをさせるButtonを配置して実行させる感じではないでしょうか?
    • good
    • 2
この回答へのお礼

考え方についてはわかりました!ありがとうございます。
ユーザーフォームには、「登録」というコマンドボタンを作っており、そのボタンに上記の内容とを入力しており、別の「入力」というシートに上から順に情報が追記されているような状態です。
単純な入力のみですので、その他にはユーザーフォームの終了ボタンしか作っておりません。
ただ、入力項目がそれぞれ数字を入力していくものが多く、全部で200項目程度あり、さらに混乱してしまっているような状態です…

お礼日時:2018/07/11 11:59

登録ボタンの動作コードもですけど、どんなSheet構成になっているかが分からない(列とコントロールとの関係も)状態では、


回答も難しいのではないかと思いますよ。
ズブの素人ですので他の方はわかるのかもですが。。。
    • good
    • 1

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

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


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