- ベストアンサー
エクセルでデータを抽出して日報を作成する方法
- エクセルを使用して顧客データから日報を作成する方法について説明します。顧客データには名前や電話番号などがあり、それを日報のシートに移す作業を行います。マクロ初心者でもわかりやすく書いたコードをご紹介します。
- 日報を手書きからエクセルで作成するための方法を解説します。顧客データから郵便番号を絞り込んで、顧客名を日報に移す作業を行います。また、マクロ初心者向けにコードの書き方も詳しく説明します。
- エクセルで顧客データを抽出し、日報のシートに顧客名を移す方法を紹介します。マクロ初心者でもわかりやすいように、詳細な手順とコードの例を示します。日報作成の効率化に役立つ情報です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>ちなみに日報はデスクトップにあるんですが、顧客データは違うフォルダの中に入っています。 顧客データと日報を同じファイルにすることはできないのでしょうか。 仮に、顧客データがサーバーとか共有フォルダーにあって他のユーザーと共有しているとか、理由が あったとして、 別途、顧客データのシートを準備して、ボタンを作成 ボタンを押すと、顧客データを開いて、日報のファイルにコピーする マクロを作成 顧客データに変更、追加などあった場合に、データを更新するほうがパソコンにもほかのユーザーにも 負担をかけずにすみます。 後は あるセルに郵便番号を入れると 13行目以下に、該当の顧客リストが13行目以下に表示させるマクロを考えるだけです。 仮に B10セルに 検索したい郵便番号を入れる、別途 顧客データ といシート名にデータがあるとして 日報のシート名のタブを右クリック、コードの表示をクリック VBエディターが起動するので Private Sub Worksheet_Change(ByVal Target As Range) '↑はシートのセルに変更があったらこのイベントが実行される If Target.Address = "$B$10" Then '変更はあったセルがB10(郵便番号を入れるセル)の場合のみ以下を実行 j = 13 '13行目から Range("A13:D1000").ClearContents' 元の表示を消す For i = 2 To Sheets("顧客データ").UsedRange.Rows.Count '顧客データの数だけ繰り返す If Sheets("顧客データ").Range("C" & i).Value = Target.Value Then '顧客データの郵便番号とB10で入れた郵便番号が一緒であれば、以下を実行 Range("A" & j).Value = Sheets("顧客データ").Range("A" & i).Value Range("B" & j).Value = Sheets("顧客データ").Range("B" & i).Value Range("C" & j).Value = Sheets("顧客データ").Range("C" & i).Value Range("D" & j).Value = Sheets("顧客データ").Range("D" & i).Value j = j + 1 ' 表示する行をひとつ下の数字へ End If Next End If End Sub を貼り付けて試してみて下さい。 ボタンを押すことなく、抽出したい郵便番号を入れるだけでマクロが実行できます。
その他の回答 (3)
- hallo-2007
- ベストアンサー率41% (888/2115)
No2です。 前の回答にも記述しましたが、サンプルのコードは >別途 顧客データ といシート名にデータがあるとして の場合です。 日報のファイルに、シートを追加、シート名を 顧客データ としてください。 そして、共有フォルダにある顧客データのすべてを選択、コピーして貼り付けてください。 そして、必要であれば >ボタンを押すと、顧客データを開いて、日報のファイルにコピーする マクロを作成 なぜ、直接、共有フォルダの顧客データを読みにいかないようするかといえば 検索の作業のたびに共有フォルダのデータを開く必要があるので 1、結果が出るまでの時間がかかる。 2、ほかのユーザーと同時に開きに行った場合は、どう処理するかなど複雑になる。 からです。 顧客データをコピーするマクロは、マクロの記録で作成できます。 ボタンの作成=>マクロの記録 ファイル=>開く=>共有フォルダーの顧客データ=>データのシート全てを選択&コピー=> 日報のファイルの顧客データのシート選択&貼り付け 顧客データのシートを閉じる マクロの記録の終了 といった流れです。
- doara_2011
- ベストアンサー率59% (25/42)
>For i = 2 To Sheets("顧客データ").UsedRange.Rows.Count >の部分でエラーが発生してしまいました。 とありますが、どんなエラーが出力されていたでしょうか? それを書いて頂かないと回答するほうも困ってしまいます。 もし、「インデックスが有効範囲にありません。」と表示される場合は "顧客データ"という名前のシートがあることを確認して下さい。 No.2さんは顧客データというシートが、日報シートと同じワークブックに あることを前提にマクロを書かれています。 上記でない場合は、見当がつかないので補足して下さい。 以上
お礼
的確な指摘をありがとうございました。 もう少しマクロを勉強したいと思います。
補足
doara_2011さんのおっしゃる通りです。 補足が足らず、すみませんでした。 マクロを実行したら「インデックスが有効範囲にありません」が表示されました。 顧客データと日報は同じワークブックにはありません。 日報はデスクトップ上にあり各個人で使ってます。 顧客データは1つのPCの中の共有フォルダに入れています。
- MackyNo1
- ベストアンサー率53% (1521/2850)
基本的に、別ブックのデータを処理する場合はそのファイルを立ち上げて処理する必要があります。 今回のケースなら、マクロの記録を利用すれば、ほぼご希望のコードを取得できます。 すなわち、顧客データファイルを立ち上げ、オートフィルタで該当データを絞込み、絞り込んだデータ範囲を大きめに選択して(データ数の追加に対応できるように空白行を含めて)、コピーして、日報のセルに貼り付けて、顧客データファイルのフィルタモードを解除してこのファイルを閉じてみてください。 最後に、このコードの郵便番号を指定する部分(Criteria1:=の後の部分)を抽出する郵便番号が入力されたセル番地の値と置き換えてください。
お礼
MackyNo1さん、回答ありがとうございました。 今回は、hallo-2007さんのマクロで希望通りのことができたので ベストアンサーに選ばせていただきました。
お礼
hallo-2007さん、親切な回答ありがとうございました。 同じワークブック内で試したらうまくできました。 ありがとうございます。今後はもう少しマクロを勉強したいと思います。
補足
hallo-2007さん ご丁寧な回答ありがとうございます。 コードを貼り付けして実行してみましたが、 For i = 2 To Sheets("顧客データ").UsedRange.Rows.Count の部分でエラーが発生してしまいました。 お手数をおかけしますが、再度教えていただけますでしょうか? ちなみに顧客データは共有フォルダに入れてあり5~6名で使う予定です。 顧客データが5MBほどあり営業が使っているPCも古いため、何とか共有フォルダ に入れて使いたいと思ってます。