Excel VBAでの業務組み立て方法についての質問

このQ&Aのポイント
  • Excel VBAで業務を組み立てる方法について相談です。現在、Excel VBAを学んでいますが、まだ自分でロジックを組むことができません。具体的な作業内容や画像を用いて回答例を教えていただけると助かります。
  • Excel VBAを使って業務組み立てる方法についての質問です。現在、アビバでExcel VBAを学習中ですが、まだ自分でロジックを組むことができません。回答者の方に、具体的な作業手順や画像を使って示していただけると助かります。
  • Excel VBAで業務組み立ての方法について教えてください。現在、Excel VBAを学んでいますが、自分でロジックを組むのが苦手です。以下の作業を行いたいのですが、具体的な手順をご教示いただけますか?1. (1).xlsmのA3セルの値が(2).xlsmのA列に無いかを調べる。合致する値がある場合は、それぞれのB列にチェックを記入し、(1).xlsmと(2).xlsmのSheet2に行の値を張り付ける。合致する値がない場合は、次の行へ移動する。2. 上記の作業をA列の一番下の行まで繰り返す。3. (1).xlsmと(2).xlsmのSheet3に、チェックがされていない行の値を張り付ける。
回答を見る
  • ベストアンサー

この業務をExcel VBAでどう組めばよいですか

ご覧頂きありがとうございます。 現在アビバでExcel VBAを学んでいますが、多少はコードが読めたり弄ったりできるようになりましたが、1からロジックを組んで書き上げる事はまだ到底できそうにありません。。。 添付の画像を基に 下記の作業をどなたか回答例を書いて頂けませんか>< お願いします! ---------------------------- 1. (1).xlsmのA3セルの値が(2).xlsmのA列に無いか 上から順番に調べ、”最初に合致した箇所”を調べる →合致する値がある時 ・それぞれのB列(チェック)に 〇 を記入 ・(1).xlsmと(2).xlsmのSheet2に、それぞれ 〇 を記入した”行すべて”の値を張り付ける →合致する値がない時 ・次の行へ移動する((1).xlsmのA3→A4) 2. 順番1. をA列の一番下の行までデータがなくなるまで繰り返す 3. (1).xlsmと(2).xlsmのSheet3に、それぞれ 〇 が記入されていない”行すべて”の値を張り付ける (サンプル) (1).xlsm A品番 395011500033920 220680700001422 241670200000110 348646464554646 395011500033920 167311400021200 (2).xlsm B品番 167311400021200 395011500033920 220680700001422 241670200000110 167311400021200 241670200000110 ---------------------------- 分かりづらいところがあれば補足いたします、 お力添えください><

質問者が選んだベストアンサー

  • ベストアンサー
  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.3

軽くコードを組んでみました。 ・比較する2つのブックのみを開いた状態で実行する。  値は双方のブックに出力される。 ・(2).xlsmのSheet1のチェックは、途中で合致する値があったとしても最後まで比較する。  合致した時点でチェックを切り上げる場合は、CompareArrayプロシージャのコメントアウトを外す事。 ・レイアウトが関係している場所には※を付けているので、適宜変更の事。 Private Type Config  'プロシージャ間で持ち回る値を格納  Book As Workbook  aryNum() As String '比較する値。  aryFlg() As Boolean '合致する値かどうか End Type Sub CompareBooks() 'ttps://okwave.jp/qa/q9719657.html  Dim i As Long  Dim Conf() As Config  ReDim Conf(1 To 2)  'ブックを取得。  Set Conf(1).Book = ThisWorkbook  Set Conf(2).Book = GetOtherBook  '比較する値を取得。  For i = 1 To UBound(Conf)   Conf(i).aryNum = GetAryNum(Conf(i).Book.Worksheets("Sheet1"))  Next i  '値を比較。  Call CompareArray(Conf)  '結果を出力。  For i = 1 To UBound(Conf)   Call OutputData(Conf(i))  Next i End Sub Private Function GetOtherBook() As Workbook '既に開いている自身以外のBookを返す。  Dim myBk As Workbook  'エラーチェック  If Workbooks.Count <> 2 Then   MsgBox "開いているブック数が2個ではありません。"   End  End If  For Each myBk In Workbooks   If Not myBk Is ThisWorkbook Then    Set GetOtherBook = myBk    Exit Function   End If  Next myBk End Function Private Function GetAryNum(TargetSheet As Worksheet) As String() '対象のブックのA3からA列の最終行までの値を配列に格納。  Dim i As Long  Dim LastRow As Long  Dim RtnAry() As String  '最終行を求め、その範囲の値を配列に格納して返す。  LastRow = TargetSheet.Cells(TargetSheet.Rows.Count, 1).End(xlUp).Row '※  ReDim RtnAry(1 To LastRow - 2) '※  For i = 3 To LastRow '※   RtnAry(i - 2) = TargetSheet.Cells(i, 1).Value '※  Next i  GetAryNum = RtnAry End Function Private Sub CompareArray(Conf() As Config) '合致する値があるかどうか、2つの配列を比較する。  Dim i As Long, j As Long  '配列の要素数を設定  For i = 1 To UBound(Conf)   ReDim Conf(i).aryFlg(1 To UBound(Conf(i).aryNum))  Next i  '値を比較  For i = 1 To UBound(Conf(1).aryNum)   For j = 1 To UBound(Conf(2).aryNum)    If Conf(1).aryNum(i) = Conf(2).aryNum(j) Then     '値が合致していれば、合致フラグをonにする。     Conf(1).aryFlg(i) = True     Conf(2).aryFlg(j) = True '    GoTo CONTINUE:'(2).xlsmのチェックを途中で切り上げるなら、コメントアウトを解除。    End If   Next j CONTINUE:  Next i End Sub Private Sub OutputData(Conf As Config) '引数のデータをシートに出力する。  Dim i As Long  Dim cntTrue As Long, cntFalse As Long 'Sheet2及びSheet3に出力する行番号  cntTrue = 0: cntFalse = 0 '※  For i = 1 To UBound(Conf.aryNum)   If Conf.aryFlg(i) Then    'その値が合致していれば    Conf.Book.Worksheets("Sheet1").Cells(i + 2, 2).Value = "○" '※    cntTrue = cntTrue + 1    Conf.Book.Worksheets("Sheet2").Cells(cntTrue, 1).NumberFormat = "@"    Conf.Book.Worksheets("Sheet2").Cells(cntTrue, 1).Value = Conf.aryNum(i) '※   Else    '合致していなければ    cntFalse = cntFalse + 1    Conf.Book.Worksheets("Sheet3").Cells(cntFalse, 1).NumberFormat = "@" '※    Conf.Book.Worksheets("Sheet3").Cells(cntFalse, 1).Value = Conf.aryNum(i) '※   End If  Next i End Sub PS >プログラムは作文と同じ(中略)順番に翻訳していくだけです。 >試行錯誤で(中略)上達します。  これは自分も同意します。  自分は独学ですが、作りたいコードがある→どんな命令を使えばいいのか検索する→実装する、を繰り返して上手くなっていきました。  いきなり全部を作ろうとするのではなく、一つ一つのステップを順番に作っていけば、案外なんとかなるものです。

konrar51
質問者

お礼

回答頂き、本当にありがとうございました。 作成頂いたコードですが、自分が想定していた動作を再現して頂いており急を要するものでしたので本当に助かりました。 書いて頂いた内容を理解し、ソラで自分一人で組めるようになるよう練習したいと思います。ありがとうございました。

その他の回答 (3)

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.4

勉強しはじめの頃は、自分でフローチャートを書いたほうがいいですよ。 あなたの目標が「1からロジックを組んで書き上げる事」であれば、なおさらです。 ロジックを考える → フローチャートを作る → フローチャートに従ってコーディングする 他の回答にもあるように、コーディング自体は単なる翻訳作業です。

回答No.2

プログラムは作文と同じです。あなたが書いたやりたいことを順番に翻訳していくだけです。 答えに頼るより試行錯誤でどこまでできてどこからできないのかを見つけていくと上達します。 試行錯誤すると応用もできます。答えに頼るとブックが増えたとき、シートが複数の時手も足も出なくなってしまいます。 アビバがどのように教えているのかわかりませんが、先生に聞けるなら試行錯誤でうまくいかないところを聞くとよいと思います。

  • kkkkkm
  • ベストアンサー率65% (1615/2454)
回答No.1

ブックを作るのが面倒なのですべてシートにしてますが適宜変更してください。 (2).xlsmの2回目の 167311400021200 は「”最初に合致した箇所”」に該当せず 3. (1).xlsmと(2).xlsmのSheet3に、それぞれ 〇 が記入されていない”行すべて”の値を張り付ける に該当させています。 Sub Test() Dim c As Range, FRange As Range Dim Sh1 As Worksheet, Sh2 As Worksheet Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") For Each c In Sh1.Range(Sh1.Cells(3, "A"), Sh1.Cells(Rows.Count, "A").End(xlUp)) Set FRange = Sh2.Range(Sh2.Cells(3, "A"), Sh2.Cells(Rows.Count, "A").End(xlUp)). _ Find(c.Value, LookAt:=xlWhole, After:=Sh2.Cells(Rows.Count, "A").End(xlUp)) If Not FRange Is Nothing Then If c.Value = FRange.Value Then c.Offset(0, 1).Value = "◯" '↓(1).xlsmSheet2に Sheets("Sheet3").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value FRange.Offset(0, 1).Value = "◯" End If Else '↓(1).xlsmのSheet3に Sheets("Sheet5").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value End If Next For Each c In Sh2.Range(Sh2.Cells(3, "A"), Sh2.Cells(Rows.Count, "A").End(xlUp)) If c.Offset(0, 1).Value = "◯" Then '↓(2).xlsmのSheet2に Sheets("Sheet4").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value Else '↓(2).xlsmのSheet3に Sheets("Sheet6").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Value = c.Value End If Next End Sub

konrar51
質問者

お礼

急ぎ回答を作成頂き、本当にありがとうございました。 作成頂いたコードですが、自分が想定していた動作を再現して頂いており急を要するものでしたので本当に助かりました。 書いて頂いた内容を理解し、組めるようになるようkkkkmさんのコードを参考に練習したいと思います。ありがとうございました。

関連するQ&A

  • エクセル2013 マクロ ご教示ください

    1行目は見出し Sheet1 A列に品番 B列に個数 C列に注文日 D列に納入日 Sheet2 A列に品番 B列に品が納入される週単位の数値 (1、2、4・・・等) Sheet1のA列~C列が入力された時、 Sheet2のA列を参照してSheet1のA列と合致した品番が Sheet2で見つかったら Sheet1のD列 = Sheet1のC列 * Sheet2のB列の数値x7日 を、表示させたいです。 合致する品番が無い場合は 該当なし と表示させたいです。 どうか宜しくお願い致します。

  • VBAのプログラムに関してです

    VBAに関する質問です。 いま、A列に0~4の数字が順番に繰り返し記入されていて(数字の数はランダム)、B列に適当な値が記入されています。A列の中から1を探しだして(1つ上の行の数字が0)、 その行から1つ戻ったB列の値をC列に記入、A列の次の0~4の繰り返しで同じ条件の1を探してその行から2つ戻ったB列の値をD列に記入する。といったことをA列が空白の行になるまで繰り返し行うというプログラムを教えてほしいです。お願いします。 例) A:00011112233400001123334400011111122233400000- B:12345678912345678912345678912345678912345678- となってるA列のそれぞれの0~4の塊の最初の1をさがしてそれに対応するBをそぜぞれ求めていくというものです。 この場合だと実行結果C・D列には C:379 D:688 となってほしいです。

  • VBA,二つのExcelのsheetにデータ保存

    VBA初心者です。 皆様のお力をお貸し頂きたく質問させて頂きます。よろしくお願いいたします。 質問内容は、下記になります。 Excelのsheet1には、縦列A,B,C・・・とデータが入っております。 sheet1の例 A B C sheet2は、入力するsheetです。 今回はA列の3行目からとします。 問題は、sheet1の縦の列をA,B,C,Dとすればデータの更新は、出来るのですが sheet1のデータのA,B,C一つ飛んでEまた一つ飛んでGという感じでsheet1のデータを 飛ばしてsheet2に表示、更新(保存)をしたいと思います。 ですので、sheet2のA列の3行目からA,B,C,飛んでE飛んでGとsheet1からデータを 表示させ、さらにsheet2の入力値が変更されると、sheet1のデータが入っている A,B,C,E,Gに更新される仕様です。 sheet1(データが入っています) A , B , C , E , G , 値1 , 値2 , 値3   , 値4 , 値5 sheet2(入力する、入力したデータは、sheet1へ更新される) A列 3行目 、sheet1の値1(A列)が入ります。 4行目 、sheet1の値2(B列)が入ります。 5行目 、sheet1の値3(C列)が入ります。 6行目 、sheet1の値4(E列)が入ります。 7行目 、sheet1の値5(G列)が入ります。 以上です。申し訳ございませんが、ご教授よろしくお願いいたします。

  • エクセルVBAのコードの書き方を教えてください

    エクセルVBAの初心者です。 下記①-⑲のようなコードを書きたいのですが、どなたかお分かりになる方がいましたら、 ご教示いただけますと幸いです。 ① オートフィルターでシート[list]のA列に"●"がある特定の行だけを以下作業の対象にしたい ② ①で特定した行のE列セルの値を、シート[output]のB9セルにコピペする ③ ①で特定した行のF列セルの値を、シート[output]のB12セルにコピペする ④ ①で特定した行のG列セルの値を、シート[output]のB15セルにコピペする ⑤ ①で特定した行のH列セルの値を、シート[output]のB18セルにコピペする ⑥ ①で特定した行のI列セルの値を、シート[output]のB21セルにコピペする ⑦ ①で特定した行のJ列セルの値を、シート[output]のB24セルにコピペする ⑧ ①で特定した行のK列セルの値を、シート[output]のB27セルにコピペする ⑨ ①で特定した行のL列セルの値を、シート[output]のB30セルにコピペする ⑩ ①で特定した行のM列セルの値を、シート[output]のB33セルにコピペする ⑪ ①で特定した行のN列セルの値を、シート[output]のB36セルにコピペする ⑫ ①で特定した行のO列セルの値を、シート[output]のB39セルにコピペする ⑬ ①で特定した行のP列セルの値を、シート[output]のB42セルにコピペする ⑭ ①で特定した行のQ列セルの値を、シート[output]のB45セルにコピペする ⑮ ①で特定した行のR列セルの値を、シート[output]のB48セルにコピペする ⑯ ①で特定した行のS列セルの値を、シート[output]のB51セルにコピペする ⑰ ①で特定した行のT列セルの値を、シート[output]のB54セルにコピペする ⑱ ①で特定した行のU列セルの値を、シート[output]のB57セルにコピペする ⑲ シート[output]のB3:B59をテキストファイルを呼び出してコピペする ※このとき、上記②-⑱で記述したB9からB57のセルには改行が含まれる場合が  あるため、テキストファイルへのペースト時に""が表示されてしまうが、  もし可能であれば、この""が表示されないようにしたい。

  • エクセルVBAで検索の早い方法

    こんにちは。 エクセルのVBAでお教え下さい。 シート1のA列に下記の様なデータがあって ABCDは業者コードだとおもって下さい。 A A B C D D 違うシート2に下記のように業者コードの マスターがあるとします。 A D シート1の全てのA列がシート2のマスターと 合致するかどうかで、合致しなかった場合にエラーを 表示するようなことをしたい(この場合、BCがエラー)のですが、どういうプログラムにするのが処理的に早いでしょうか? ぐるぐる順番に回す方法以外になにか良い手は ありますでしょうか? お教え下さい。よろしくお願いします。

  • Excel VBA の質問です

    ユーザーフォームの中のコンボボックスの値をリストから呼び出して選択したとき、テキストボックスの値を同じリストの別の列から表示させたいです 会社の仕事で品番と品名がありますが、必ず品番は一つの固定の品名を持っています。 なので、品番を製品のマスタからひろってきてるのでわざわざ品名を入力するのは面倒です 製品マスタは例えばA列の2行目に ある品番があればその品名がB列の2行目に必ずあります よろしくお願いします

  • Excel vba の書き方教えてください。

    書き方が分からないのでおしえてください。 やりたい動作は下記になります。 データは Sheet1のA列にIPアドレスだけ書いてあります。 Sheet2のA列にはIPアドレス(例 111.111.111.*) B列には名前(例 honsya) Sheet3のA1にはAAAAA、 A2にはBBBBB が書いてあるシートがあります。 (1)処理が完了したデータを記入するシート(シート名:完了)を作成。 (2) Sheet1のIPアドレスを第3オクテッド目までの値が同じものをSheet2のA列から探します。 (3)探し出したA列の値の右よこのB列の値を作成した完了のシートに書きだします。 その際 Sheet3に記載されているデータと検索対象のIPアドレスをB列の値にくっつけます。 ↓こんな感じに AAAAA "[B列の値]([検索対象のIPの第4オクテッド])" [検索対象のIPアドレス] BBBBB この状態のものが 完了 のシートに書きだされるようにしたいのです。 ここ数日これで悩んでて解決しないのでどなたか助けてください。

  • エクセルVBAの質問

    お世話になります。 下記の様な表がシート1に有り(行数は日で変動し、大体100から200行位)、F列に数字が有る場合、その行のA列、B列、E列の値をコピーして、シート2のA2からC2に貼付したいのですが、また貼付は、10行ごとに、貼付するスタート位置が変わります。 A2~A11、A16~25、A31~40という具合に10行貼り付けたら次は、5行下からまた続きを貼付ていくイメージです。 どの様な記述をしたら良いでしょうか。ご教示下さいます様宜しくお願い致します。        記 A列  B列  C列   D列   E列   F列 No  品番  品名   地区   数量  236  A6TET  みかん  市川   3本 248  A7TGR  りんご  松戸   5本 273  B9GKT  ぶどう  柏    14本   17 273  A8UFE  すいか  行徳   6本    381  C2ROF  いちご  平井   22本   20

  • Excelのハイパーリンクについて

    下記の様なリンクを作りたいです。 2つのシートにそれぞれ表を用意しています。 シート1      A列   |  B列  |  C列  |・・・・ 1行|       |  5/20 |  5/21  |・・・・ 2行|  名前A  |  123  |      |・・・・ 3行|  名前B  |     |  234  |・・・・             :             :             : シート2に     A列   |  B列    |C列 1行|名前A   |  5/20    |123  ←ここの値は何でも良い(分かり易くするために123にしました) : : : と入っています。(実際はもっと沢山の情報があります) シート2のC列の値をハイパーリンクにして クリックされたら シート1のA列の値=シート2のA列の値 シート1の1行目の値=シート2のB列の値 で シート1のB2に飛びたいです。 この様な式を作りたいです。

  • エクセル VBA

    最終行から順番に下へ同列で入力するVBAを教えて下さい。 EXCELのVBAで教えて下さい。 シート1のA列にはB列が入力されると自動入力されるNo.があり、C~G列もB列が入力されると自動入力されます。 B列には日付が、H列には3~4桁の数字が入力したいのですが、 入力行は必ず最下行のセルB、Gな為、VBAでフォームを作成し、 入力実行ボタンを押すことにより、最下行のセルB、Gに反映されるように したいです。 又、上記入力後に、シート2のH~N列をコピーして、シート3のA~G列に値のみの貼り付けを行い保存した後、シート3のA~G列をコピーして csvファイルを作成して保存したいです。 一連の流れを、フォームの入力実行ボタンを押すことで実行したいのですができるのでしょうか? 宜しく御願い致します。

専門家に質問してみよう