[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『処理後に済印を入れたい』(himawari222)
またまた困った問題が起きました。
リストのデータがあります。 手入力シートで、部品番号を入力して、vlookupで、 数値を取り出してきます。
その処理済みのものに、元のデータのリストに印を”済”とつけたいのです。 どのようにすればよいのでしょうか。 よろしくお願いいたします。
逆方向に VLOOKUP すればよろしいかと。(純丸)
すみません・・・説明が足りなかったです。 手入力シート(sheet1)で、A1に部品コードを入力します。 A B 1 B1は、リストシート(sheet2)(A列〜F列データ有)から vlookでデータを取り出してきます。 A1は、1件入力して、請求書を印刷したら、 データをクリアして、次の新しいデータを入力して・・・ と同じ作業を繰り返します。 1回印刷したら、印刷済の印を、 その元のデータのリストシート(sheet2)のG列に表示させたいのです。 よろしくお願いいたします。(himawari222)
そのような条件であればマクロになりますね。元表に「済」を入れるのは、A1セルに 入力した時と、印刷を実行した時とどちらがいいのでしょうか?(純丸)
レスありがとうございます。印刷を実行した時でお願いします。(himawari222)
もうひとつ。部品番号が入力されているのは、Sheet2の A列ですか?(純丸)
はい、そうです。よろしくお願いします(himawari222)
後はマクロ達人の方の提案を待ちましょう。(私にはそのスキルが無いので、、) (純丸)
わかりました。純丸さん、どうもありがとうございました。 ・・・ちなみに・・・ですが、 マクロを使わないで実行するのは無理なんでしょうか・・・。 (himawari222)
私の知る限りで出来る事はこんなのです。
前提 Sheet1、Sheet2という名前のシートを対象とする。 両シート共にA列に検索値があること。
標準モジュールに以下を記載 Sub 印刷済マークをつける() On Error Resume Next Dim PrintSheet As Worksheet Dim TargetSheet As Worksheet Dim Row As Long Dim ColString As String Dim RowIndex As Long Dim PrintCell As String Set PrintSheet = Worksheets("Sheet1") '印刷するシート If Err Then GoTo ErrorHandler Set TargetSheet = Worksheets("Sheet2") '済マークをつける対象シート If Err Then GoTo ErrorHandler PrintCell = "A1" '今回処理した値が入っているセルアドレス ColString = "G" '済マークをつける列 '対象シートの同値の行を取得 RowIndex = WorksheetFunction.Match(PrintSheet.Range(PrintCell).Value, TargetSheet.Range("A:A"), 0) If Err Then Err.Clear Else '済マークをセット TargetSheet.Range(ColString & RowIndex).Value = "済" End If Exit Sub ErrorHandler: If Err Then MsgBox Err.Number & ":" & Err.Description Err.Clear End If End Sub
処理対象ブックのWorkbook_BeforePrintに以下を記載 Private Sub Workbook_BeforePrint(Cancel As Boolean) Call 印刷済マークをつける End Sub
問題点 印刷をキャンセルした場合でも済マークがつく。 →回避案:印刷するかどうかという問いも含めマクロ化する?
(修正) A1のみ対象という点を見落としてたので修正… 変数名修正… 回避案記載… (ご近所PG)もうちょい良い手は無いものか
himawari222さん、A1セルがどんどん変わっていく以上、計算式では出来ません。 どうしてもマクロに頼ることになります。 ご近所PGさん、お手数をおかけしました。勉強のため私もちょっと考えてみました。 A1の値を取得して、For Each でSheet2のA列と突合せする。一致したら Offset で G列に「済」を入れるというロジックです。それ以外の細かい処理は入れてません。(^^; どんなもんですかね?(純丸)
※ 取り合えず Sheet2 のコード入力範囲は A1:A10 としてあります。
Sub 済み入力 ' ' Dim mr As Range Dim mw As Worksheet Dim c As Range Dim A1No As Long
Set mw = Worksheets("Sheet2") Set mr = mw.Range("A1:A10")
A1No = Range("A1").Value
For Each c In mr If c.Value = A1No Then c.Offset(0, 6).Value = "済" End If Next c
End Sub
>どんなもんですかね? ぬゆ、私に対する問いかしら? 一点だけ…見つかったら抜ける処理を。 If c.Value = A1No Then c.Offset(0, 6).Value = "済" Exit For '←これ End If 前提として、Sheet2のリストが一意である事。 もし重複があるなら無い方が良いとも言えますが、そこは質問者さん次第って所で。 私の処理でも、リストは一意である事が前提です。 今回私の記述ではFor〜Nextはあえて避けました。 10行程度であれば問題ありませんが、 もしSheet2の件数がとても多かったら時間がかかるかな〜という懸念からです。 (ご近所PG)他にはWorksheetFunctionも使ってみたかったとかなんとか
純丸さん、ご近所PGさん、ありがとうございます。 わたくし、マクロに関しては、またさらに不勉強でして、 まったくわからない状態なので、教えていただいたものを よく読ませていただき、勉強させていただこうと思います。 ありがとうございました。また、わからないことが出てしまったら 質問させてください。 ありがとうございました。(himawari222)
ご近所PGさん、ありがとうございました。プロはエラー回避や処理時間に細かく気を 使っているのだなぁと改めて思いました。今後ともよろしくご指導下さい。 himawari222さん、スレをお借りしました。ありがとうございました。
参考までに数式で処理するものを書いてみました。 Sheet1の1行目を固定して、 2行目以下最下段に追加して、B列の部品番号を入力して行くものとします。 請求書は、Sheet3にSheet1の最下段のものを表示させ、 元データには、行の連続b配置し、請求済み欄は、Sheet1の存在の有無に よって判断するものとしています。 (LOOKUP)
=Sheet1= (出力指定) A B C D 1 行 部品番号 品名 1 ← この行ウィンドウ枠固定 2 2 30 プリンタ 3 1 10 PC (入力) ↑ ↑ =LOOKUP(99^9,A1:A100) ↑ =IF(B2="","",INDEX(Sheet2!C$2:C$100,A2)) =IF(B2="","",MATCH(B2,Sheet2!B$2:B$100,))
=Sheet2= (元データ) A B C D E F G H 1 行 部品番号 品名 納入日 数量 単価 金額 請求 2 1 10 PC 1/10 1 500,000 500,000 済 3 2 30 プリンタ 2/20 1 50,000 50,000 済 4 3 50 ラーメン 3/15 10 100 1,000 5 4 ↑ 6 5 =LEFT("済",COUNT(MATCH(B2,Sheet1!B$2:B$100,))) 7 6 … … 100 99
=Sheet3= (請求書) A B C D 1 請求書 2 部品番号 品名 3 10 PC 4 ↑ 5 ↑ =INDEX(Sheet2!C2:C100,1) 6 =INDEX(Sheet2!B2:B100,Sheet1!D1) 7 納入日 数量 単価 金額 8 1/10 1 500,000 500,000 9 ↑ ↑ =INDEX(Sheet2!G2:G100,Sheet1!D1) ↑ =INDEX(Sheet2!F2:F100,Sheet1!D1) ↑ =INDEX(Sheet2!E2:E100,Sheet1!D1) =INDEX(Sheet2!D2:D100,Sheet1!D1)
lookupさん、ありがとうございます。 早速勉強させていただきます。 取り急ぎ、お礼まで(himawari222)
発想を変えて、数式で期待する動きとするための表の作りにする、 って事ですか。確かに理にかなっている。 (ご近所PG)数式はむつかしくて私には手も足もでないょぅ
・・・すみません。数式もマクロも、どちらも勉強不足なので、 教えていただいた色んな方法を勉強させていただこうと思っています。 (時間はかかるとは思いますが) 教えてくださった皆様、ありがとうございました。 (himawari222)
たびたびすみません。 LOOKUPさんが教えてくださった方法を試させてもらい、うまく動きました。 Sheet3の請求書なのですが、印刷をする場合、 入力する部品番号が複数ある場合は、どのように指定すればよいのでしょうか。 マクロの方は、まだなのですが・・・(himawari222)
元データや請求書のレイアウトを教えていただけませんか? (LOOKUP)
データは、全て、LOOKUPさんが挙げてくださったデータを使いました。 Sheet1のD列の1の 意味と、LOOKUPの『99^9』の意味もわからないのです。 勉強不足ですみません。(himawari222)
>入力する部品番号が複数ある場合は、どのように指定すればよいのでしょうか。 とおっしゃっているでしょう? 私の回答は、一度に一行だけ処理するものなのです。 複数行処理する請求書の場合には、かなりの変更が必要なのです。 (LOOKUP)
99^9は、99の9乗で、整数では、手入力で端数まで表示できる999999999999999より 大きい数で、=LOOKUP()の第1引数に代入しますと、配列の一番奥にある数値を戻します。
何度もすみませんでした。わかりやすく解説していただいて、勉強になりました。 どうもありがとうございました。(himawari222)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.