![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
マクロ初心者です。
シート”受注書”からシート”受注履歴”に
履歴情報を書き込むマクロを作成しています。
初心者丸出しで恥ずかしいのですが、
下記のように組んでいます。
Sub 受注情報書き込み()
Dim ws01 As Worksheet
Dim ws02 As Worksheet
Set ws01 = Worksheets("受注書")
Set ws02 = Worksheets("受注履歴")
ws02.Activate
' 受注No入力
ws01.Range("C2").Copy
ws02.Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues
' 受注日入力
ws01.Range("M2").Copy
ws02.Range("B" & Rows.Count).End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues
' 出荷日入力
Sheets("粗利報告書").Range("D3").Copy
ws02.Range("C" & Rows.Count).End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteValues
・
・
・
この場合、受注書シートが空白の場合、
受注履歴シートも空白になると思うのですが、
次回、履歴を書き込む時に空白を詰めて(最終行に)
入力してしまう事を避けたいです。
空白は残しつつ、一受注を同じ列に入力する為には、
どうしたら良いでしょうか?
No.4ベストアンサー
- 回答日時:
>一受注を同じ列に入力する為には~
同じ列 → 同じ行 という意味ですよね?
確実に同じ行にするためには、各列で最終行を判定しないで、書き込む行番号を求めたら、全体でその番号を使うようにするとよいです。
書き込む行番号はどうやって求めるか?
必ず空白でない項目があれば、その列の最終行をもとに決めればよいですし、どの項目にも空白の可能性があるなら、#1様のご提案のようにどこかに最終行を控えておくなどの方法が考えられます。
質問文の内容だけから判断すると、「履歴」シートのA~C列の空白行の最大行番号に書き込むという方法でもよさそうなのでそような例を…
Sub test()
Dim ws01 As Worksheet, ws02 As Worksheet
Dim r As Long, c As Integer, tmp As Long
Set ws01 = Worksheets("受注書")
Set ws02 = Worksheets("受注履歴")
For c = 1 To 3 ' A列からC列までの最終行を捜査
tmp = ws02.Cells(Rows.Count, c).End(xlUp).Row
If tmp > r Then r = tmp
Next c
ws02.Cells(r, 1).Value = ws01.Range("C2").Value ' 受注No
ws02.Cells(r, 2).Value = ws01.Range("M2").Value ' 受注日
ws02.Cells(r, 3).Value = Sheets("粗利報告書").Range("D3").Value '出荷日
End Sub
みたいな感じではいかがでしょうか。
なお、手で捜査する場合は「コピー」-「ペースト」になりますが、VBAの場合は、↑例のように直接値を代入することでも可能です。
(1行の処理ですみます。特に今回はPaste:=xlPasteValuesとしていて、書式等のコピーはしていないので同じ結果になります。)
No.3
- 回答日時:
こんにちは。
なかなか難しい質問だと思います。
私の場合は、こういう場合、カスタムプロパティを使います。カスタムプロパティというのは、ファイル-プロパティのユーザー設定のことです。手動で設定してもよいのですが、マクロを作ってみました。
サブルーチンの CountCheck(ByRef iCount As Long) で、行数を決めます。
初期値は、1になっています。実際の行は、プロパティのユーザー設定の数値を入れてください。
こんな方法もあるというぐらいでもよいです。
'-----------------------------------------------
Sub 受注情報書き込み()
Dim ws01 As Worksheet
Dim ws02 As Worksheet
Dim i As Long
Set ws01 = Worksheets("受注書")
Set ws02 = Worksheets("受注履歴")
Call CountCheck(i) 'サブルーチン
If i <= 0 Then MsgBox "CustomsProperty がヘンです。", 64: Exit Sub
ws02.Activate
' 受注No入力
ws02.Range("A" & i).Value = ws01.Range("C2").Value
' 受注日入力
ws02.Range("B" & i).Value = ws01.Range("M2").Value
' 出荷日入力
ws02.Range("C" & i).Value = Worksheets("粗利報告書").Range("D3").Value
End Sub
Sub CountCheck(ByRef iCount As Long)
'カスタムプロパティに加算
iCount = ThisWorkbook.CustomDocumentProperties("カウント").Value
ThisWorkbook.CustomDocumentProperties("カウント").Value = iCount + 1
End Sub
Sub SettingProperties()
'カスタムプロパティの設定(1回きりです)
Dim cnt As Long
cnt = 1 '初期値
On Error GoTo ErrHandler
With ThisWorkbook.CustomDocumentProperties
.Add Name:="カウント", _
LinkToContent:=False, _
Type:=msoPropertyTypeNumber, _
Value:=cnt
End With
Exit Sub
ErrHandler:
If Err.Number < 0 Then
MsgBox "既に登録は終わっています。"
Else
MsgBox Err.Number
End If
End Sub
ご回答、ありがとうございます!
ちょっと、難かしく、もっと勉強してから
見直したいと思います。
感謝しております。
ありがとうございました。
No.2
- 回答日時:
>非表示セルの値を変数hogeに格納→Cells(1 , hoge + 1)→出力処理→非表示セルの値+1・・・
すみません。↑なんですが、「Cells(1 , hoge + 1)」は参照する非表示セルの初期値が0・空文字・NULLの何れかを想定しています。
参照する非表示セルの初期値を1とし、出力位置の列アドレスが11である場合は「Cells(1 , hoge)」で問題ないです。
言ってることがわからなかったり、うまくいかない場合は補足要求お願いします。
No.1
- 回答日時:
VBAではセル上の空白(空文字・NULL)が必要なものか否かを判断することができないので、非表示セルを用意して、そこにカウント数を持っておくのが宜しいかと思います。
【初期出力】
受注履歴シートに出力する→出力正常終了→非表示セルの値+1
【次の出力】
非表示セルの値を変数hogeに格納→Cells(1 , hoge + 1)→出力処理→非表示セルの値+1・・・
みたいな感じでどうでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Excel(エクセル) vba 転記するときの最終行について 2 2022/09/03 09:31
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Excel(エクセル) VBA でvlookup エラーなどは削除したい 8 2022/12/30 04:03
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
作番ってどういう意味でしょうか?
-
「直需」の意味を教えてください
-
access2003初心者です。データ...
-
「失注」の意味を教えてくださ...
-
お弁当の宅配業者向け業務アプ...
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Accessでテーブル名やクエリ名...
-
Oracle 2つのDate型の値の差を...
-
セルの右クリックで出る項目を...
-
ACCESSで和暦を西暦に・・・
-
Accessでテーブルの値をテキス...
-
Accessのフィールド数が255しか...
-
Excel→Accessへ貼り付けがおかしい
-
Accessで数値型にNULLをInsert...
-
3つの表を1つに縦に連結する
-
ACCESSのクエリで集計で、先頭...
-
ORACLEで一番最初の結果だけを...
-
Oracleのビュー作成時に「指定...
-
Accessレポートで特定条件で改...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「直需」の意味を教えてください
-
作番ってどういう意味でしょうか?
-
「失注」の意味を教えてくださ...
-
ACCESSで、DMax関数の条件の書き方
-
Access:サブフォームのレコー...
-
ACCESS 選択した値を別...
-
アクセスで営業日を計算させる...
-
アクセスのクエリで、前回に入...
-
マクロ転記で指定した列の最終...
-
受注受付期間とはなんですか?...
-
Accessの受注発注について
-
フォーム入力、更新後処理で指...
-
会社 ファイルの収納
-
データシート形式のサブフォー...
-
更新クエリの日付抽出方法について
-
通販サイトの運用の問題点は?
-
EXCEL 最終行に入力するマクロ
-
VBA でvlookup エラーなどは削...
-
エクセル・スプレッドシートで...
-
Excelで在庫管理表を作ってます...
おすすめ情報