こんにちは。よろしくお願いします。
エクセルで出荷入力画面シートに数字を入力。もし、発注しなくてはならない
在庫数設定より(在庫限界入力シート)、その商品の総合計(在庫残高シート)が
少なくなったら、メッセージボックスに警告を表示したいのです。
先日、親切な方々のアドバイスで、以下のように組んで見ましたが、
入力シートにはたくさんの商品があり、どのセルに入れても全部同じメッセージ
ボックスがでてしまいます。これができないと、お茶組のままです。
がんばって作ってきたエクセルが、期限に間に合いません。助けてください。
Private Sub Worksheet_Calculate()
dim counter as integer
If Worksheets("在庫残高").Range("C6") < Worksheets("在庫限界入
力").Range("C6") Then
counter=Worksheets("在庫限界入力").Range("C6")-Worksheets("在庫
残高").Range("C6")
MsgBox counter& "本在庫不足", vbOKOnly, "警告"
End If
End Sub

一行目のworksheetをobjectにしてもだめでした。また()のなかに入力する
全てのセルの範囲を指定してもだめでした。
どうすればいいのでしょう。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>どのセルに入れても全部同じメッセージボックスがでてしまいます。


#241482については、単一の『C6』の変更時の判定の仕方を書いています。
どのようにして『Worksheets("在庫残高").Range("C6")』が更新されるか分からなかったからです。

この例を沢山の商品の在庫残高についても同様に使われているようですが、複数にするには変更が必要でしょう。
出荷入力画面シートの入力がどのように在庫残高シートに反映するかがはっきりしないと解決にはならないかもしれません。


出荷入力画面シートに入力すると在庫残高シートの『同じ列が更新』されるとすると、以下の訂正くらいで対応できるかもしれません。

出荷入力画面シートのコードウインドウに貼り付け、#241482と同じように、在庫残高シートで変動する数値を、出荷入力画面シートで分かるようにしておく必要があります。

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim clm As Integer '入力したセルの列
  Dim counter As Long '不足数

  clm = Target.Column
  If Worksheets("在庫残高").Cells(6, clm) < Worksheets("在庫限界入力").Cells(6, clm) Then
    counter = Worksheets("在庫限界入力").Cells(6, clm) - Worksheets("在庫残高").Cells(6, clm)
    MsgBox counter & "本在庫不足", vbOKOnly, "警告"
  End If
End Sub
    • good
    • 0
この回答へのお礼

本当にありがとうございます。質問するたびに本と照らし合わせて
勉強しています。
おかげさまで、質問の答えがわかり、ちゃんと思い通りになりました。
でも・・・おっちょこちょいな私なので、また新たな問題が発生しました。
それは、新しい質問をしますので、もしよかったら
もう一度御教授ください。
よろしくおねがいします。

お礼日時:2002/03/28 15:06

正直VBAは詳しくはないです。

おかしな部分もあるかと思います。
・飛び飛びのセルを参照できる。
・出荷入力時で在庫がマイナスになるなら在庫数は0で不足分を返す。
・出荷入力時で在庫がまだあるなら差し引き分を在庫数とし、不足分を返す。
・限界に満たないなら差し引き分を在庫とする。
Private Sub Worksheet_Change(ByVal target As Range)
'出荷入力セルのアドレス取得
Dim taddr As String: taddr = target.Address
'出荷入力したアドレスがA1?
If taddr = "$A$1" Then
'chgZaiko(入力アドレス,在庫アドレス,限界アドレス)
Call chgZaiko(taddr, "C6", "C6")
ElseIf taddr = "$A$2" Then
Call chgZaiko(taddr, "C7", "C7")
End If
End Sub

Private Sub chgZaiko(ByVal addr1 As String, ByVal addr2 As String, ByVal addr3 As String)

Dim count As Integer: count = 0
Dim inpt As Integer: inpt = Worksheets("出荷入力").Range(addr1)
Dim zaiko As Integer: zaiko = Worksheets("在庫残高").Range(addr2)
Dim genkai As Integer: genkai = Worksheets("在庫限界入力").Range(addr3)
'在庫数-出荷数 < 限界数
If zaiko - inpt < genkai Then
If zaiko - inpt < 0 Then
'在庫数-出荷数<0なら在庫数は0
Worksheets("在庫残高").Range(addr2) = count
MsgBox inpt - zaiko & "在庫不足", vbOKOnly, "警告"
Else
'在庫数-出荷数>0なら在庫数は在庫数-出荷数
count = genkai - (zaiko - inpt)
Worksheets("在庫残高").Range(addr2) = zaiko - inpt
MsgBox count & "在庫不足", vbOKOnly, "警告"
End If
Else
'在庫数-出荷数 > 限界数
count = zaiko - inpt
Worksheets("在庫残高").Range(addr2) = count
MsgBox "現在の在庫数" & count
End If
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。問題は前の人のを参考にしたら
できました。
またよろしくお願いします。

お礼日時:2002/03/28 15:07

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【Excel】在庫管理 VBA 関数

在庫・販売管理用のファイルをExcelにて作成しています。

仕様
・仕入管理/在庫管理/販売管理の3シート
・商品データは在庫管理シートに記録
・商品にはそれぞれ商品番号をつけ管理

まだ運用前なのですが、以下のような運用方法を考えています。
それにあたって、自動化したい作業があるのですが、なかなかできず…。

VBAの知識をお持ちの方,お力をかして頂けないでしょうか?
もしくは関数で同じような動作が実行可能なら、そちらでも構いません。

<仕入れがあった場合>
(1)在庫管理シートに商品を登録(以前に取り扱ったことのある商品の場合は省略)
(2)仕入管理シートに商品の仕入数を記録(VLOOKUP関数で在庫管理シートから商品名等を呼び出します)
(3)在庫管理シートに(2)で入力した仕入数反映(在庫管理シートにプラス) ← ここを自動化したいです

<販売した場合>
(1)販売管理シートに販売した商品、価格、個数、販売相手などを記録(同じく在庫管理シートから商品詳細を呼び出します)
(2)在庫管理シートに(1)で入力した販売数を反映(在庫管理シートからマイナス) ← ここを自動化したいです

この自動化ができれば在庫管理シートがリアルタイムの在庫を表示するようになるので、とても便利なのですが、今現在の状態だと、この「自動化したい部分」を手作業にてやる予定です。
現在は商品の出入がとても少ないので、手作業でも問題ないのですが、今後商品が増えることを考えると実用的ではなく…。

できれば、「入力してすぐ反映」というシステムより、「入力後確認→確定→反映」というシステムにしたいのですが…。(ワガママで申し訳ないです)

私は関数はある程度扱えますが、VBAについては初心者の状態から今勉強中といったところです。

是非皆様のお力を貸して下さい!よろしくお願い致します。

在庫・販売管理用のファイルをExcelにて作成しています。

仕様
・仕入管理/在庫管理/販売管理の3シート
・商品データは在庫管理シートに記録
・商品にはそれぞれ商品番号をつけ管理

まだ運用前なのですが、以下のような運用方法を考えています。
それにあたって、自動化したい作業があるのですが、なかなかできず…。

VBAの知識をお持ちの方,お力をかして頂けないでしょうか?
もしくは関数で同じような動作が実行可能なら、そちらでも構いません。

<仕入れがあった場合>
(1)在庫管理シートに商品を登録...続きを読む

Aベストアンサー

(3)在庫管理シートに(2)で入力した仕入数反映(在庫管理シートにプラス) ← ここを自動化したいです
仮に
 仕入管理シート
 商品番号 商品名 仕入日  仕入数

 在庫管理シート
 商品番号 商品名 仕入総数  販売総数 在庫数

とあったとします。
仕入総数は =SUMIF(仕入管理!A:A,A2,仕入管理!D:D)
で得られますよね。
総販売数量も同様ですので
在庫数は =C2-D2 です。
この関数を在庫管理シートにたっぷりとコピーしておけば十分です。

QVBAでの在庫管理

エクセルVBAで在庫管理をしたいと思っていますが、難しく前へ進まず悩んでいます。
すいませんが、ご教授ください。
一つのシートに下表のような表があります。
これをロットをキーとして一行にまとめ、在庫数まで求めたいです。
いい方法はありませんか?

製品  ロット  入庫  出庫  在庫
A   1111  1000      
A   1112  1000      
A   1112       500
A   1111       500
A   1111  1000

Aベストアンサー

マクロ(VBA)例です。
仮にデータをSheet1、集計表をSheet2に作成しています。
Sheet1シートタブ上で右クリック→コードの表示→サンプルコード貼り付け→Sheet1上でAlt+F8キー押下→sample実行

概略は、製品&ロットをキーにデータ(製品~出庫)を集計DBに入出庫数を計数して登録、集計表を出力しています。

Sub sample()
Dim DB, wk(3), wk1, rslt, wkey As String, i As Long, j As Long, k As Long
Set DB = CreateObject("Scripting.Dictionary")
'** データ配列作成
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
For j = 0 To 3
If Cells(i, j + 1) <> "" Then
wk(j) = Cells(i, j + 1)
Else
wk(j) = 0
End If
Next
wkey = wk(0) & "," & wk(1)
If Not DB.Exists(wkey) Then
'** 新規データ登録
DB.Add wkey, Join(wk, ",")
Else
'** 登録済み入出庫計数
wk1 = Split(DB(wkey), ",")
wk1(2) = wk1(2) + wk(2)
wk1(3) = wk1(3) + wk(3)
DB(wkey) = Join(wk1, ",")
End If
Next
'** 集計表出力
With Sheets("sheet2")
.Cells.Clear
.Cells(1, "A").Resize(1, 5).Value = Cells(1, "A").Resize(1, 5).Value
wk1 = DB.keys
k = 1
For i = LBound(wk1) To UBound(wk1)
rslt = Split(DB(wk1(i)), ",")
k = k + 1
For j = 1 To 4
If rslt(j - 1) <> "0" Then
.Cells(k, j) = rslt(j - 1)
End If
Next
.Cells(k, "E") = .Cells(k, "c") - .Cells(k, "D")
Next
End With
End Sub

マクロ(VBA)例です。
仮にデータをSheet1、集計表をSheet2に作成しています。
Sheet1シートタブ上で右クリック→コードの表示→サンプルコード貼り付け→Sheet1上でAlt+F8キー押下→sample実行

概略は、製品&ロットをキーにデータ(製品~出庫)を集計DBに入出庫数を計数して登録、集計表を出力しています。

Sub sample()
Dim DB, wk(3), wk1, rslt, wkey As String, i As Long, j As Long, k As Long
Set DB = CreateObject("Scripting.Dictionary")
'** データ配列作成
For i = 2 To Cells(Rows.Count, "A"...続きを読む

Qエクセルで在庫管理表の作り方を教えてください。

    A     B     C
1列.入庫数 出庫数 総枚数
2列. 10    5    100


「(入庫数-出庫数)+総枚数」で出た枚数をC2に上書きさせたいのですが、出来ません。
「(A2-B2)+C2」じゃ出来ないのでしょうか?

例えば「C2が90の時は総枚数が95になる」という風な在庫管理表を作りたいのです。

本当に初心者ですみませんが、回答お待ちしております。よろしくお願いします。

Aベストアンサー

>上書きさせたいのですが
関数では、原理的に絶対できません。
C2に入れる式の右辺は、C2を含んではなりません。循環参照のエラーが出るでしょうに。
ぐるぐる回りの計算になり値として、収集がつかなくなるからです。
使い始めたらすぐ経験するでしょう。
マクロ・VBAを使えばできないこともないですが、こんあんところで使うのは適してないと思う。
「総枚数」とは何ですか。通常前日在庫などの数が来るのではないですか。
在庫管理の仕事に経験ありますか。

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qエクセルを使った、在庫管理と発注。

エクセルを使った、在庫管理と発注。


私は、エクセルが得意ではないのですが、今日、用事で退社する上司に「手が空いているので何かやっておくことがあったら言ってください」といったところ、思わぬ無茶振りをされてしまい、とても困っています。在庫管理などに関する知識がまったく無い人間なので、説明が長くなってしまうことと、わかりにくい点があるかもしれないですが、なるべくわかりやすく書こうと思うのでご協力お願いいたします。


現在当社の商品在庫は、エクセルで管理されております。
発注は目視で足りないと思ったら適性分だけ頼むかたちです。

今度上司のしたいことはエクセルの在庫データを使って「発注リスト」が自動的に作成されることです。

例えば、商品Aの適正在庫が5だとして、それを切ったら自動でリストの中に適正在庫になるような個数と商品名が載る。あとはそれをプリントアウト(パソコンからも送れるのでそれで自動発注できればなお良いです)してFAXで発注。というかたちです。

それは、エクセル上で全部済めばそれでも良いですが、そのやり方が複雑な場合、こんな方法、こんな簡単なソフトがあるよ、という意見がありましたらよろしくお願いしたいです!!

当社POSシステムはございません。導入もいたしませんのでどうかパソコンでの方法でご回答お願いいたします。

アクセスは、当社で使える者がいないため、なるべくエクセルを使う形にしたいみたいです。

何か説明が足りないようでしたらご指摘ください。

よろしくお願いいたします!

エクセルを使った、在庫管理と発注。


私は、エクセルが得意ではないのですが、今日、用事で退社する上司に「手が空いているので何かやっておくことがあったら言ってください」といったところ、思わぬ無茶振りをされてしまい、とても困っています。在庫管理などに関する知識がまったく無い人間なので、説明が長くなってしまうことと、わかりにくい点があるかもしれないですが、なるべくわかりやすく書こうと思うのでご協力お願いいたします。


現在当社の商品在庫は、エクセルで管理されております。
発注は目視...続きを読む

Aベストアンサー

No.1です!
何度もごめんなさい。
前回は単に適正在庫数に足らないものだけを表示するだけです。
ご希望としてはそのリストを印刷できる表にしたい!ということだと思いますので、
もう一度画像をアップしてみます。

商品補充リストをSheet2に表示するようにしてみました。
Sheet1は前回そのままで、

Sheet2のA2セルに
=IF(COUNT(Sheet1!$C$2:$C$1000)<ROW(A1),"",INDEX(Sheet1!A$2:A$1000,SMALL(IF(Sheet1!$C$2:$D$1000<>"",ROW($A$1:$A$999)),ROW(A1))))

これは配列数式になってしまいますので、データ量が多い場合はコンピュータにかなりの負担を与えます。
という訳で、Sheet1の1000行目まで対応できる数式にしていました。

Sheet2のA2セルにこの画面からコピー&ペーストしただけではエラーになると思います。
貼り付け後、F2キーを押す、または貼り付けセルをダブルクリック、または数式バー内で一度クリックします。
編集可能になりますので、Shift+Ctrlキーを押しながらEnterキーで確定します。
数式の前後に{ }マークが入り配列数式になります。

そして、B2セルに
=IF(A2="","",VLOOKUP(A2,Sheet1!A:C,3,0))
(これは配列数式ではありません)

最後にZ2・B2セルを範囲指定し、B2セルのフィルハンドルで下へコピーすると
画像のような感じになります。

以上、参考になればよいのですが・・・
何度も失礼しました。m(__)m

No.1です!
何度もごめんなさい。
前回は単に適正在庫数に足らないものだけを表示するだけです。
ご希望としてはそのリストを印刷できる表にしたい!ということだと思いますので、
もう一度画像をアップしてみます。

商品補充リストをSheet2に表示するようにしてみました。
Sheet1は前回そのままで、

Sheet2のA2セルに
=IF(COUNT(Sheet1!$C$2:$C$1000)<ROW(A1),"",INDEX(Sheet1!A$2:A$1000,SMALL(IF(Sheet1!$C$2:$D$1000<>"",ROW($A$1:$A$999)),ROW(A1))))

これは配列数式になってしまいますので、データ量が多...続きを読む

QExcel VBA 在庫管理表 式の入力を繰り返す

Excel VBA 在庫管理表 式の入力を繰り返す

簡単な式を繰り返し入力し、自動で最終行まで有効在庫数を求めるマクロを作りたいのですが、なかなか出来ず困っています。
VBAの知識をお持ちの方,お力をかして頂けないでしょうか?よろしくお願いします。

・製品の受注数と在庫数、有効在庫数の管理表があります。
・各製品名毎に受注日と受注数がまとめられていて、それぞれ1行又は複数行になります。
・各製品名と製品名の間に空白セルが入ります。(←繰り返す際、区切りとして利用出来ないか?)
・A列には各製品名と製品名の間に「品名」が入ります。(←繰り返す際、これも利用出来ないか?)
・ここでF列の有効在庫欄にマクロで自動的に次の簡単な式を入れて、有効在庫を計算で導き出したいのですが・・・。

有効在庫セルに…(添付図参照下さい)
 (1) 1行目 =現在庫-受注数
 (2) 2行目 =1つ上の有効在庫-受注数(例:=F4-D5)
 (3) 3行目以降 2行目の式を繰り返す

以上の式を最後の行(数千行)まで繰り返す命令を作りたいのですが・・・問題は製品名によって行数が違うことと、各製品名毎の間に空白行(セル)(←上手く区切りで使えるのかも…)が入るのですが、どの様に考えればいいでしょうか?

繰返しの構文は…
  Do While
  Loop
などを使えば良いと思うのですが、中身の命令文をどうしたら良いか分かりません。

例えば・・・
・A3から下に見ていって「品名」という言葉が出てくるまで行数をカウント。
・行数が1行の場合(1)の式、2行の場合(2)の式、3行以上・・・の場合で場合分け(Case文)

などとすれば良いのかなと思いますが、VBA初心者のため、どの様に命令文を書いたらいいか分らず困っています。

私は関数は多少扱えますが、VBAについては初心者の状態から今勉強中といったところです。
是非皆様のお力を貸して下さい!よろしくお願い致します。

※因みに現状は、1行の場合、2行の場合、3行以上の場合とそれぞれマクロ(の記録)を作って半手作業で対応していますので非常に手間が掛かっています。

Option Explicit
Sub Macro1セル3()
' Macro1 Macro
' Keyboard Shortcut: Ctrl+c
'
ActiveCell.Select
ActiveCell.FormulaR1C1 = "=RC[-3]-RC[-4]"
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = "=R[-1]C-RC[-4]"
ActiveCell.Select
Selection.Copy
ActiveCell.Select
Range(Selection, Selection.End(xlDown)).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
End Sub

Sub Macro2セル1()
' Macro2 Macro
' Keyboard Shortcut: Ctrl+z
'
ActiveCell.Offset(0, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = "=RC[-3]-RC[-4]"
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Sub Macroセル2()
' Macro3 Macro
' Keyboard Shortcut: Ctrl+x
'
ActiveCell.Select
ActiveCell.FormulaR1C1 = "=RC[-3]-RC[-4]"
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveCell.FormulaR1C1 = "=R[-1]C-RC[-4]"
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Excel VBA 在庫管理表 式の入力を繰り返す

簡単な式を繰り返し入力し、自動で最終行まで有効在庫数を求めるマクロを作りたいのですが、なかなか出来ず困っています。
VBAの知識をお持ちの方,お力をかして頂けないでしょうか?よろしくお願いします。

・製品の受注数と在庫数、有効在庫数の管理表があります。
・各製品名毎に受注日と受注数がまとめられていて、それぞれ1行又は複数行になります。
・各製品名と製品名の間に空白セルが入ります。(←繰り返す際、区切りとして利用出来ないか?)
・A列に...続きを読む

Aベストアンサー

以下のマクロを標準モジュールに登録してください。
Option Explicit
Public Sub 有効在庫設定()
Dim ws As Worksheet
Dim maxrow, row As Long
Dim newname, oldname As String
Set ws = Worksheets("在庫管理表")
maxrow = ws.Cells(Rows.Count, "B").End(xlUp).row 'sheet B列の最大行取得
oldname = ""
For row = 2 To maxrow
newname = ws.Cells(row, "B")
If newname <> "" Then
If newname = oldname Then
'有効在庫=前行有効在庫-受注数量(製品名の2行目以降)
ws.Cells(row, "F").Value = ws.Cells(row - 1, "F").Value - ws.Cells(row, "D").Value
Else
'有効在庫=現在庫-受注数量(製品名の1行目)
ws.Cells(row, "F").Value = ws.Cells(row, "E").Value - ws.Cells(row, "D").Value
End If
oldname = newname
End If
Next
MsgBox ("処理完了")
End Sub

以下のマクロを標準モジュールに登録してください。
Option Explicit
Public Sub 有効在庫設定()
Dim ws As Worksheet
Dim maxrow, row As Long
Dim newname, oldname As String
Set ws = Worksheets("在庫管理表")
maxrow = ws.Cells(Rows.Count, "B").End(xlUp).row 'sheet B列の最大行取得
oldname = ""
For row = 2 To maxrow
newname = ws.Cells(row, "B")
If newname <> "" Then
If newname = oldname Then
'有効在庫=前行有効...続きを読む

Qエクセルで、条件に一致した行を別のセルに抜き出す方法

エクセルで、指定した条件に一致するセルを含む行をすべて抜き出す方法が知りたいです。

たとえば、

<A列> <B列> <C列>
7/1 りんご 100円
7/2 ぶどう 200円
7/2 すいか 300円
7/3 みかん 100円

このような表があって、100円を含む行をそのままの形で、
別のセル(同じシート内)に抜き出したいのですが。

7/1 りんご 100円
7/3 みかん 100円

抽出するだけならオートフィルターでもできますが、
抽出結果を自動的に、別の場所に、常に表示させておきたいのです。

初歩的な質問だと思いますが、検索しても分からなかったので、よろしくお願いします。

Aベストアンサー

同じ質問が結構よく出てますが、そんなに初歩的でもありません
別シートのA1セルに「100円」と入力し、そのシートの任意のセルに以下の式を貼り付けて下さい。後は、下方向、右方向にコピー。
日付のセル書式は「日付」形式に再設定してください

=IF(COUNTIF(Sheet1!$C:$C,$A$1)>=ROW(A1),INDEX(Sheet1!A:A,LARGE(INDEX((Sheet1!$C$1:$C$500=$A$1)*ROW(Sheet1!$C$1:$C$500),),COUNTIF(Sheet1!$C:$C,$A$1)-ROW(A1)+1)),"")

データ範囲は500行までとしていますが、必要に応じて変更して下さい

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QVBAで条件が一致する行のデータを別シートに抽出

"Sheet1"のA列に区分(文字列)、B列~D列に分析数値があり
A列の文字が条件に一致した行のデータを"Sheet2"にコピー、
元の"Sheet1"のデータは行ごと削除といった形で考えているのですが、どうも上手くいきません。

Dim Keywrd As String
???
With Worksheets("Sheet1").Columns("A:A")
Set Keywrd = .Find("キーワード", LookIn:=xlValues)
???
End With
Set Keywrd = Nothing
TargetCell.EntireRow.Select
Selection.Delete Shift:=xlUp
End Sub


???部分の変数宣言と処理内容をどうすれば良いか、ご教授願えますでしょうか。

Aベストアンサー

こんばんは。

#1の回答者です。一度きりなら、こんな風に直してみたらよいと思います。質問のコードは、変数の流れがおかしくなっているようです。

Sub Macro1()
  Dim Keywrd As String
  Dim TargetCell As Range
  Keywrd = InputBox("キーワードを入れてください", "キーワード入力")
  If Keywrd = "" Then Exit Sub
  With Worksheets("Sheet1").Columns("A:A")
    Set TargetCell = .Find(Keywrd, LookAt:=xlWhole, LookIn:=xlValues)
    If TargetCell Is Nothing Then
      MsgBox Keywrd & " は見つかりません。"
      Exit Sub
    End If
  End With
  'Keywrd = "" ''不要
  TargetCell.EntireRow.Copy Worksheets("Sheet2").Range("A1")
  TargetCell.Delete Shift:=xlUp

End Sub

--------------------------------------
#1 のコードを考え直し修正しました。
私のコードは、必ず、検索値に対して複数、該当するものがあるという条件になっています。

---------------------------------------------
Sub TestFind2()
 Dim myKeyWord As String
 Dim FirstAdd As String
 Dim c As Range
 Dim ur As Range
 myKeyWord = Application.InputBox("検索文字を入れてください", "検索+移動", Type:=2)
 If myKeyWord = "" Or myKeyWord = "False" Then Exit Sub

 With Worksheets("Sheet1").Columns(1)
 .Cells(1).Select
 Set c = .Find( _
      What:=myKeyWord, _
      LookIn:=xlValues, _
      LookAt:=xlWhole, _
      MatchCase:=False, _
      MatchByte:=True)

  If Not c Is Nothing Then
     Set ur = c.EntireRow
     FirstAdd = c.Address
    Do
      Set ur = Union(c.EntireRow, ur)
      Set c = .FindNext(c)
    Loop Until (c Is Nothing) Or (FirstAdd = c.Address)
   End If
   ur.Copy Worksheets("Sheet2").Range("A1")
   ur.Delete Shift:=xlShiftUp
End With
   Set ur = Nothing
End Sub


 

こんばんは。

#1の回答者です。一度きりなら、こんな風に直してみたらよいと思います。質問のコードは、変数の流れがおかしくなっているようです。

Sub Macro1()
  Dim Keywrd As String
  Dim TargetCell As Range
  Keywrd = InputBox("キーワードを入れてください", "キーワード入力")
  If Keywrd = "" Then Exit Sub
  With Worksheets("Sheet1").Columns("A:A")
    Set TargetCell = .Find(Keywrd, LookAt:=xlWhole, LookIn:=xlValues)
    If TargetCell Is Nothing Then
...続きを読む

Q★エクセルでセルに文字入力をすると条件で他のセルに文字表示

エクセルで例えば顧客名を入力すると他のセルに住所とか電話とか言うような文字が表示されるような条件設定が出来ますか?
予めフォーマットを作る上で常時表示だとうるさいのでこのように出来ればよいのですが・・・。

Aベストアンサー

NO1です。
エラーになるのは、情報定義シート側に入力情報がない場合ですので、NO2さんのご回答を参考にエラーチェックを追加して見ましたので、お試し下さい。

=IF(A1<>"",IF(ISNA(VLOOKUP(A1,Sheet2!$A$2:$C$3,)),"",(VLOOKUP(A1,Sheet2!$A$2:$C$3,2,1))),"")


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

人気Q&Aランキング