[[20101104150651]] 『マクロで上書きを追加したい』(エミリー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロで上書きを追加したい』(エミリー)

 はじめまして、マクロ初心者です。
 データベース本を見ながら下記マクロを設定しました。

 入力シートと請求管理一覧データがあり、入力シートに
 「呼び出し」のマクロボタンと、「新規保存」のマクロボタンを
 設定しています。

 今出来ることは、
 @入力シートから→請求管理データシートに新規保存ができる。
 A請求管理一覧データに既に登録済みのデータを、
 入力シートの請求管理NO検索で呼び出すことができる。

 の2点です。今のままですと、Aでせっかく呼び出した既存データ
 に変更を加え、保存すると、以前のもの(削除されずそのまま)と、
 さらに今回のデータが保存され、請求管理NOが重複してしまいます。

 Aで呼び出したデータを入力シート画面上で上書き変更して、
 変更情報を、請求管理データに上書き保存したいと思っています。
 「呼び出し」「新規保存」以外に、「上書き」のマクロボタンを
 設定したいのですが・・・よくわかりません。

 是非、ご教授いただけませんでしょうか。
 宜しくお願い致します。

――――――――――――――――――――――――

 Option Explicit

 Sub 新規レコード転記()
    Dim motoSht As Worksheet, sakiSht As Worksheet, sakiRng As Range, i As Long
    Dim motoHani()
    '変数の宣言
    Set motoSht = Sheets("入力シート")
    '入力用のシートをセット
    Set sakiSht = Sheets("請求管理データシート")
    '蓄積用のシートをセット
    motoHani = Array("C4", "C6", "E6", "C7", "E7", "C9", "E9", "G9", "C10", "C12", "G12", "C13", "C14", "C15", "C16", "E16", "G16", "C17", "E17", "G17", "G7", "C19", "F19")
    '転記したいセルの位置を配列に格納
    Set sakiRng = sakiSht.Range("B" & Rows.Count).End(xlUp).Offset(1)
    '新規レコードの入力位置を取得
    For i = 0 To UBound(motoHani)
        sakiRng.Offset(0, i).Value = motoSht.Range(motoHani(i)).Value

        Next
    '配列に指定した順番でレコードの値を転記
    MsgBox "入力を完了しました。"
 End Sub

 Sub 新規レコード転記2()
    Dim motoSht As Worksheet, sakiSht As Worksheet, sakiTbl As Range, sakiRng As Range, i As Long
    Dim lastRec As Range, newRec As Range
    Dim motoHani()

    Application.ScreenUpdating = False  '画面の更新をストップ

    Set motoSht = Sheets("入力シート")
    Set sakiSht = Sheets("請求管理データシート")

    motoHani = Array("C4", "C6", "E6", "C7", "E7", "C9", "E9", "G9", "C10", "C12", "G12", "C13", "C14", "C15", "C16", "E16", "G16", "C17", "E17", "G17", "G7", "C19", "F19")

    Set sakiTbl = sakiSht.Range("請求管理データマスタ")
    Set sakiRng = sakiTbl.Cells(sakiTbl.Rows.Count, 1).Offset(1)

    For i = 0 To UBound(motoHani)
        sakiRng.Offset(0, i).Value = motoSht.Range(motoHani(i)).Value
      '  motoSht.Range(motoHani(i)).MergeArea.ClearContents
    Next

    Set lastRec = sakiTbl.Rows(sakiTbl.Rows.Count)
    Set newRec = lastRec.Offset(1)
    lastRec.Copy
    newRec.PasteSpecial xlFormats

    Set sakiTbl = sakiTbl.Resize(sakiTbl.Rows.Count + 1)
    Names("請求管理データマスタ").RefersTo = sakiTbl

    Application.ScreenUpdating = True  '画面の更新を元に戻す

    MsgBox "入力を完了しました。"
 End Sub

 Sub 連番表示()
    Dim tmpNo As Integer, myTbl As Range
    '変数の宣言
    Set myTbl = Range("請求管理データマスタ")
    'テーブルのセット
    tmpNo = Application.WorksheetFunction.Max(myTbl.Columns(1))
    '1フィールド目の最大値を求める
    MsgBox "最新No.は、" & tmpNo + 1 & "です。"
 End Sub

 Function 連番取得(myTbl As Range, myFld As Integer)
    Dim tmpNo As Integer
    tmpNo = Application.WorksheetFunction.Max(myTbl.Columns(myFld))
    連番取得 = tmpNo + 1
 End Function

 Sub 請求管理NO検索()
    Dim tmpInt As Integer, motoHani(), myRng As Range, i As Integer
    '変数の宣言
    tmpInt = Sheets("入力シート").Range("C4").Value
    '検索する値を取得
    motoHani = Array("C6", "E6", "C7", "E7", "C9", "E9", "G9", "C10", "C12", "G12", "C13", "C14", "C15", "C16", "E16", "G16", "C17", "E17", "G17", "G7", "C19", "F19")
    '転記する位置を設定

    Set myRng = Range("請求管理データマスタ").Columns(1).Find(tmpInt, LookAt:=xlWhole)
    '請求管理データシートの1フィールド目を対象に検索
    If myRng Is Nothing Then
        MsgBox "該当するレコードはありませんでした"
        Exit Sub
    End If
    '検索値が無かった場合は処理を抜ける
    For i = 0 To UBound(motoHani)
        Range(motoHani(i)).Value = myRng.Offset(0, i + 1)
    Next
    '検索値が見つかったセルを元にレコードの情報を転記
 End Sub

 こんにちは。

 >「呼び出し」「新規保存」以外に、「上書き」のマクロボタンを
 >設定したいのですが

 ご質問への回答ではないのですが、「新規保存」と「上書き」を分けるよりも、
「保存」1つにして、請求管理NO検索によって新規(NOがない場合)か上書き(既存の場合)か
コード内で判定するほうが、使いやすく、メンテもしやすいのではないでしょうか。
(似たようなツールを作ったことがありましたので)

 (コタ)
# それにしても、本を見ながらだけでこれだけのコードが書けるのは、すごいですね。

 コタさん、早速のお返事ありがとうございます!

 仰るとおり、コード内で判定する方法にしたいです・・
 が・・どう変更すればいいのか?応用ができません。

 出来ましたら、上記マクロのコードを変更して
 教えていただけないでしょうか?

 すみません、ずうずうしいのですが・・
 是非ともよろしくお願い致します☆

 (エミリー)

 ←行頭を半角スペースで始めると書き込みの改行位置が反映されます。 

 では、どう変更すればいいかを、いっしょに考えていきましょうか。
(といっても私はレスが遅いので、その点はごかんべんを)

 まず提示されたコードの確認です。
以下の5つありますが、
 (1)入力シートから→請求管理データシートに新規保存ができる。
 (2)請求管理一覧データに既に登録済みのデータを、入力シートの請求管理NO検索で呼び出すことができる。
はそれぞれ、どのコードを使用しているのでしょうか。
※丸付き文字は機種依存のため、カッコで代用します。

 Sub 新規レコード転記()
 Sub 新規レコード転記2()
 Sub 連番表示()
 Function 連番取得(myTbl As Range, myFld As Integer)
 Sub 請求管理NO検索()

 また、↓の転記コードは、なぜ2つあるのでしょうか。
 Sub 新規レコード転記()
 Sub 新規レコード転記2()

 (コタ)

 コタさん、おはようございます!
 早速、本日もよろしくお願い致します☆

 (2)請求管理一覧データに既に登録済みのデータを、
入力シートの請求管理NO検索で呼び出すことができる。

 は、→Sub 請求管理NO検索()  のコードを使用しています。

 (1)入力シートから→請求管理データシートに新規保存ができる。
は、→Sub 新規レコード転記2()  のコードを使用しています。

 そして、
また、↓の転記コードは、なぜ2つあるのでしょうか。
 Sub 新規レコード転記()
 Sub 新規レコード転記2() が2つある理由は、
本に書いてあったのをそのまま入力したので・・・
よく分かりません。。

 すみません・・本当に初心者なので・・
あまり理解できていないところ多いです(恥ずかしながら・・)

 コタさん、お忙しいところ恐縮ですが・・
来週、社内プレゼン?するので・・・
出来れば本日中の完成を目指しています!

 是非とも宜しくお願い致します☆

 (エミリー)

 >来週、社内プレゼン?するので・・・出来れば本日中の完成を目指しています
ごめんなさい、私にはできません。
時間の制約がなく、内容を一緒に理解しながら完成を目指すのであれば、お手伝いさせていただきますが、
そうでないのなら、他の方のご回答をお待ちください。

 (コタ)

 こんにちは
 転記する際に請求管理NOがあれば上書き、無ければ「新規レコード転記」をCallします。
 「新規レコード転記」「新規レコード転記2」の違いは見てないので分かりません。
 Sub 請求管理NO検索_転記()
    '変数の宣言
    Dim tmpInt As Integer, motoHani(), myRng As Range, i As Integer
    Dim motoSht As Worksheet

    '入力用のシートをセット
    Set motoSht = Sheets("入力シート")

    '検索する値を取得
    tmpInt = motoSht.Range("C4").Value

    '転記する位置を設定
    motoHani = Array("C6", "E6", "C7", "E7", "C9", "E9", "G9", "C10", _
                        "C12", "G12", "C13", "C14", "C15", "C16", "E16", _
                        "G16", "C17", "E17", "G17", "G7", "C19", "F19")

    '請求管理データシートの1フィールド目を対象に検索
    Set myRng = Range("請求管理データマスタ").Columns(1).Find(tmpInt, LookAt:=xlWhole)

    '検索値が無かった場合は処理を抜ける。または新規レコード転記を Call する。
    If myRng Is Nothing Then
        MsgBox "該当するレコードはありませんでした"

        '新規レコード転記を Call する場合。
        Call 新規レコード転記

        Exit Sub
    End If

    '検索値が見つかったセルに入力シートのレコードの情報を転記
    For i = 0 To UBound(motoHani)
        myRng.Offset(0, i + 1).Value = motoSht.Range(motoHani(i)).Value
    Next
End Sub
(ウッシ)

ウッシさま、ありがとうございます^^!!

出来ました!
本当に、嬉しいです!!

これを機会にもう少しマクロのコードの
勉強しようと思います。
本当にありがとうございました。

(エミリー)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.