Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2013)
特定の商品コードが入っている行を別シートの最終行へ追加する
投稿日時: 18/04/09 12:00:21
投稿者: makory10

シートが二つありまして、一つには在庫管理をしているデータがあります。
もう一つは発注管理のシートがあり、在庫管理の中から発注依頼をした分だけを管理していくシートがあります。
 
フォーム上のテキストボックスに商品コード「4111-1522210」(例)を入力して検索ボタンをクリックすると、在庫管理シートの中から検索にヒットしたデータの商品名、商品コードを用意しているテキストボックスに表示し、在庫管理へコピーボタンをクリックするとその行のデータを発注管理シートの最終行へコピーするということをしたいのです。
最終行の判定は発注管理のA行です。
 
プログラムにほぼ無知でして、@検索してHITさせる。(HITしなかったらエラーメッセージ)AHITしたデータの内容を用意しているテキストボックスへ表示。B該当行のコピーと発注管理シートの最終行への追加ができずに困っています。
 
みなさんのお知恵をお貸しいただけたらと思います。
 
どうぞよろしくお願いいたします。

回答
投稿日時: 18/04/09 12:44:04
投稿者: めんたん

まったくの初心者さんでしたら、ユーザーフォームの作成から取り組むより
 
1.Vlookup関数で検索
2.Vlookup関数で出てきた内容を表示したセルをコピーして発注管理シートの最終行に貼り付け
 
の2つ作業をしてみるのはどうですか?
 
2に関しては
 
Sheets("在庫管理").Range(Vlookup関数の結果表示セル範囲).Copy
Sheets("発注管理").Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlValues
Application.CutCopymode = False
 
こんな感じでコピペします。

回答
投稿日時: 18/04/10 01:38:48
投稿者: もこな2

フォームって仰ってるのでたぶんユーザーフォームのことなんだと思うんですよね。
で、「プログラムにほぼ無知でして」とおっしゃってるわりには、質問の内容を拝見するとそれなりに触っておられるように思うので、実はベース(たたき台)となるコードはできてるんじゃないでしょうか?
 
一応この掲示板のルールでも作成依頼はダメってことになってますし、そうでなくても質問者さんがどこで詰まっているのか(どういう作戦で進めようとされているのか)を把握できると、回答者側で自分がアドバイスできることかどうかが掴みやすくなりますので、作りかけでもいいので、提示されるとよいとおもいます。
 
たとえば、

makory10 さんの引用:
@検索してHITさせる。
だけでも、
・Findメソッドで探してみる
・MATCH関数で探してみる
・For〜Nextステートメントでループさせてみる
・For each 〜Nextステートメントでループさせてみる
など、いくつかアプローチがあるので質問者さんがどの方法で進めようとされているのかといったことも、回答者にとっては割と重要な情報だったりします。(説明の仕方が変わるので)

投稿日時: 18/04/11 21:49:52
投稿者: makory10

めんたんさん
もこな2さん
 
ご回答ありがとうございます。
少し調べてみて検索するところまではできるようになりました。
 
ただ、検索した後に検索した行のデータを発注管理シートへコピーすることができません。
やりたいことは、在庫管理シートで検索にヒットした行の1列目を発注管理シートの一番下の行の1列目に、在庫管理シートの2列目以降(300列ほどデータが入っています。)を発注管理シートの3列目以降にコピーをしたいのですが、どのようにしたらできるでしょうか?
 
よろしければ教えてください。
よろしくお願いいたします。
 
 
Sub test()
 
Dim CB As Range
Dim Kensaku As String
 
With Worksheets("データ")
    MOJI = InputBox("検索文字入力しよう")
    If MOJI <> "" Then
        Set C = .Cells.Find(What:=Kensaku, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, MatchByte:=False, SearchFormat:=False)
         
        If Not C Is Nothing Then
        MsgBox "発見したよ"
         
        Else
            MsgBox MOJI & "はみつかりませんでした。"
        End If
    End If
End With
 
End Sub
 

回答
投稿日時: 18/04/12 09:19:37
投稿者: mattuwan44

Sub test2()
    Dim rngData As Range
    Dim rngNew As Range
    Dim ixRow As Long
    Dim sFind As String
     
    sFind = InputBox("商品コードを入力してください。")
    If StrPtr(sFind) = 0 Then Exit Sub
     
    Set rngData = Worksheets("データ").UsedRange
    On Error GoTo ErrHandler
    ixRow = WorksheetFunction.Match(sFind, rngData.Columns(1), 0)
    On Error GoTo 0
    With Worksheets("発注管理")
        Set rngNew = .Cells(.Rows.Count, "B").End(xlUp).Offset(1)
    End With
     
    With rngData.Rows(ixRow)
        Intersect(.Cells, .Offset(, 1)).Copy rngNew
    End With
    Exit Sub
 
ErrHandler:
    MsgBox "商品コードが見つかりません。"
End Sub
 
ユーザーフォームに表示は考慮してません。
 
セルの位置は、
セルその物を見つけてもいいし(Findメソッド)
行番号を取得してもいい(Match関数)と思いますし、
VLook関数でデータを取得してもいいと思います。
 
どれかを、保持しておいて、
それを転記に利用すればいいと思います。
 
値の保持は、
ユーザーフォームのTagプロパティに文字が書き込めるので、
それを変数の代わりにつかって行番号を記録しておくとか、
モジュールレベルで変数を用意しておいてそれに保持しておくのもありかなとは思います。

投稿日時: 18/04/13 15:29:06
投稿者: makory10

mattuwan44 様
 
ありがとうございました。
イメージしていた通りに動作いたしました。
お世話になりました。