プロが教えるわが家の防犯対策術!

59歳のエクセルのVBAと関数の初心者で、どうしたものか困っています。
長乱文失礼致します、皆さんのお知恵をお借りしたく投稿しました。
業務で『購入依頼書』を『入力画面(添付ファイルの上部)』から『データ画面(添付ファイルの下部)』へVBAや関数を使用して自動転記を検討しています。
行いたい処理としては下記のA.~E.です。
------------------------------------------------------------
A. シート1(添付ファイルの上部:以下シート1)の⑤連番を自動的に振りたい、日付が変わると、初期値の『1』から始まる様にしたい。『本日は210124-001~、明日は210125-001~、』という感じです。
------------------------------------------------------------
B. A.のシートに、一通り入力が終わったらマクロボタンで印刷が完了後、シートに入力が終わったデータを別シート(添付ファイルの下部)に値として貼り付けする。
(シート1の(セル値:R6)のデータはシート2の(セル値:B2))に転記に始まり(シート1の㉔(セル値:(V8)のデータはシート2の(セル値:X3))という感じです。
(ただ日付は日付で貼り付けたい→書式の設定で日付ではなく数字の羅列になるのを避けたいです)
貼り付けが終わったらシート1の次のセル値のみ値クリアにします(クリアセル値:(B6,I6,R6,B9,N9,S9,B12,B15,F15,J15,M15,B18,F18,J18,R18))、その他は計算式が入力されているので残します。
(値残すセル:B6,L6,U6,F9,H12,Q15,U15,N18,V18)、シート1の(セル値:L6)の連番だけが数字の末尾が1プラスされた数値になっている(次回の入力)準備です。
------------------------------------------------------------
C. 1.2.の作業の繰り返しですが2のシートには、データが最初に作ったデータの下の行に次のデータが貼り付けられる様にしたいです。
------------------------------------------------------------
D. また、指定したシート1の(セル値:B6)の管理番号の商品購入依頼書を1.のシートの画面で、再印刷出来るマクロボタンも出来れば作りたいです。
------------------------------------------------------------
E. A.のシートのバーコードを読み込み、特定ファイルの特定のシートのある
同じバーコードデータのセルを選択出来るようにしたいです。
今考えているのは、シート2の(セル値:Y2,Z2)に入荷時のデータの入力を考えています。
------------------------------------------------------------
以上の処理を行いたいのです、ご教示いただきたく29日(金曜)の夜より作業を進めたいと考えておりますので、お忙しいこととは思いますが、29日(金曜)の午前中までにご教示頂けませんでしょうか。
以上、よろしくお願いします。

「エクセルのVBAや関数での転記や連番採番」の質問画像

A 回答 (3件)

#2


訂正します
間違い
>L1セルをメモリーセルとして活用します。

おそらく空いているであろうL3セルです。
コードでは、L3にしています。
Set tmpCell = Sheets(sName1).Range("L3")
    • good
    • 0

こんにちは、


VBAはどの程度の知識が御有りでしょうか?、、それをお聞きしても始まらないですね。
先ず、
>(クリアセル値:(B6,I6,R6,B9,N9,S9,B12,B15,F15,J15,M15,B18,F18,J18,R18))、その他は計算式が入力されているので残します。
(値残すセル:B6,L6,U6,F9,H12,Q15,U15,N18,V18)、
B6が重複していますが、、クリア?残す?
多分関数が入っているのでしょう。赤枠は関数入力がある?

結合セルを使用しているので マクロの自動記録を使用してクリアー範囲を作成してください。


本来、印刷シートと入力シート(フォーム)は分けるべきと考えます。
まあ、それも今更、、でしょうね。

Aの連番処理ですが、運用方法に不明な点もありますので、L1セルをメモリーセルとして活用します。フォント色を背景色と同じにして印刷時見えないようにしてください。また、セルロック保護を設定している場合は、対象から外してください。

B、Cについては、ナンバーリングされているすべてのセル値をシート2に移します。後の集計や訂正、再発行、復元などを考慮した場合、その方が賢明だと思います。この辺りは、仕様に合わせ変更してください。
L6セルに番号更新

D,?B6セルは関数は入っていないの
復元キーワード、セル又はインプットボックスなどの指定が必要です。
Data_Saveの逆を行う事になりますが、結合セルなので
.Range("D3").MergeArea(1, 1).Value= みたいな形になるかと

Eについては、バーコード読み取り機器などをお調べください。

処理の流れ
ブックを開いた時に今日の日付とL6の文字列を比較してナンバーを設定
一連処理をする場合は、Start_buttonプロシージャを実行してください
ずらっと処理プロシージャを書きます。
処理は、複数のプロシージャに分けてありますので、各処理ごとにデバッグ検証してください。

ThisWorkbook モジュールに
Private Sub Workbook_Open()
Call Module1.reNumber
End Sub
*標準モジュール名 Module1に以下のコードが必要


標準モジュール (モジュール名Module1、変更する場合該当箇所変更)

Option Explicit
'2つのシート名を設定(定数)
Const sName1 = "Sheet1"
Const sName2 = "Sheet2"

'連番作成
Sub reNumber()
Dim No As String, ChNo As String, ChDate As String
Dim tmpCell As Range
Set tmpCell = Sheets(sName1).Range("L3")
ChNo = Left(Range("L6"), 8)
ChDate = CStr(Format(Date, "yyyymmdd"))
If ChNo <> ChDate Then
tmpCell.Value = 1
Else
tmpCell.Value = tmpCell.Value + 1
End If
If tmpCell.Value >= 1 And tmpCell.Value <= 9 Then
No = "00" & tmpCell.Value
ElseIf tmpCell.Value >= 10 And tmpCell.Value <= 99 Then
No = "0" & tmpCell.Value
Else
No = tmpCell.Value
End If
Sheets(sName1).Range("L6") = Format(Date, "yyyymmdd") & "-" & No
End Sub

'一連処理 エラー処理、条件処理など加える必要があります。
'入力チェックプロセスを追加する必要があります。
Sub Start_button()
Call myPrint
Call Data_Save
Call myClear
Call reNumber
End Sub

'データ保存
Sub Data_Save()
Dim rData(23) '飛びセルの為配列に代入
With Sheets(sName1)
rData(0) = .Range("D3")
rData(1) = .Range("R6")
rData(2) = .Range("U6")
rData(3) = .Range("I6")
rData(4) = .Range("L6")
rData(5) = .Range("B6")
rData(6) = .Range("B9")
rData(7) = .Range("F9")
rData(8) = .Range("N9")
rData(9) = .Range("S9")
rData(10) = .Range("B12")
rData(11) = .Range("H12")
rData(12) = .Range("B15")
rData(13) = .Range("F15")
rData(14) = .Range("J15")
rData(15) = .Range("M15")
rData(16) = .Range("Q15")
rData(17) = .Range("U15")
rData(18) = .Range("B18")
rData(19) = .Range("F18")
rData(20) = .Range("J18")
rData(21) = .Range("N18")
rData(22) = .Range("R18")
rData(23) = .Range("V18")
End With
Dim newR
Set newR = Sheets(sName2).Cells(Rows.Count, 1).End(xlUp).Offset(1).Cells
newR.Resize(1, UBound(rData)) = rData
End Sub

'値クリアー
'ご質問の範囲指定は結合セルに対して実行できませんので、マクロの自動記録を使用してクリアー範囲を作成し("I6,R6,B9,N9,S9,B12,B15,F15,J15,M15,B18,F18,J18,R18")を書き換えてください。

Sub myClear()
With Worksheets(sName1)
'結合セルを使用しているので マクロの自動記録を使用してクリアー範囲を作成してください。
'  .Range("I6,R6,B9,N9,S9,B12,B15,F15,J15,M15,B18,F18,J18,R18").ClearContents

End With
End Sub

'印刷(プレビューとしています)
Sub myPrint()
Worksheets(sName1).PrintPreview
' Worksheets(sName1).PrintOut
End Sub

実行環境作成は行っていませんので、ほぼ未検証です。
あくまで、デバッグ用サンプルコードです。
自己責任でコピーファイルでデバッグしてください。
    • good
    • 0

こんばんは、


心中ご察し致しますが、業務で使用されるのなら、本案件は制作業者に依頼するべきかと思います。(本来QAサイトは依頼サイトではありません)

Eを除けば、さほど難しくは無いと思いますが、QAサイトで得られた情報、処理内容などは何の保証もなくリスクが高いです。仮に、実行コードが示されてもしっかりデバッグ出来ないのなら、使用するべきでないと思います。(生産性に重大な被害を与える可能性があります。)

プログラムを書く時、処理をするプロセスやコードは比較的簡単に書けますが、デバッグ(不具合や想定外を排除する試み、検証)には、時間を要します。バージョンや互換性など状況によっては、サンプルデータや運用する環境提示(提供)も必要になります。

時間も限られているようですし、生産性の向上が目的であれば、法人も当然、投資する価値があると思います。

フォーマット、要件定義もされているようなので、依頼もあまり難しくないように思います。
私的な知恵としては、ざっくりですがCについて、ブックの不具合、データ量の増大などを考え、ブックシートに蓄積するだけでなく外部にCSVやテキスト、などなどデータで保存しておいた方が良いと思います。(方法は色々あります)

お力になれず、残念ですが私的知恵として回答にさせて頂きます。
    • good
    • 1
この回答へのお礼

ありがとう

早速の回答と懇切丁寧なご説明いただきありがとうございました。
おっしゃる通りだと思います。依頼サイトではありませんよね。藁をもすがる思いで投稿してしまいました。Bだけども、どうしても作りたいのですが、お分かりでしたら、自己責任でヒントだけども教えていただけませんでしょうか?

お礼日時:2021/01/25 08:16

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