ちくのう症(蓄膿症)は「菌」が原因!?

エクセルで別シート、または別ファイルに出力、蓄積保存する方法。
マクロなんかを活用してできないでしょうか?

例えば、エクセルでa.b.c.d.eさんがリストにあるお菓子(単価も設定済み)を幾つ注文したかを表で作成しまた。個数を入力するだけで個人ごとに幾らかかるか計算式を入れてあります。日付を入力するところもありますが、例えば毎日更新するとします。
ボタンを押してマクロを実行し次の事が出来るようにしたいです。

①個人ごとの請求書の出力
数値を入力したお菓子を抽出して別ファイルの表に入れて請求書として別ファイルを出力。ファイルが無理ならシートでも可。
言ってみれば個人ごとに何を幾つ欲しいか聞いて、一覧表に入力し、それをボタン一つで個人ごとの請求書を作りたいのです。

②月ごとのトータルの請求書の出力
元のファイルは別のファイルの計算式になっているため日付は上書き更新します。ボタンを押して別シート(又は別ファイル)にその日付と、その日のトータルの請求金額を出力して蓄積保存する方法。
これは月ごとに業者に代金を支払うとして、注文のあった日にボタンを押すと別シートに、日付と金額を出力するようにしておき、蓄積保存して月ごとの請求書を作成したいのです。また、月ごとの作成なので、予めシートで○月分請求書というシートを作っておき、元の一覧表の日付から何月のか自動で振り分けられるようにしたいです。

わかりづらい内容で申し訳ありません。

マクロやVBはど素人です。
勉強中ですがよろしくお願いします。

A 回答 (3件)

つまり、毎日の出荷(売上)のデータから


取引先ごとの一か月の請求書を作りたい。
という事ですよね。
しっかりしたものまで作りたければ、VBAの力をかります。
手作業があっても良ければ、フィルターオプションなどの機能や関数を作ります。
まずは、日々の売上データのシートがきちんとできている事が必須です。
この部分が何も説明されていないので、VBAのコードなど提示できるわけありません。
アドバイス
1、日々の出荷のデータのシートがある。
  A  B   C   D  E    F
日付  顧客名 品名 数量 単価  合計金額
・・・・
2、別途請求書のフォーマットのシートがある
 顧客名
 年、月 を入れてセルがある

明細として
条件にあった、顧客、年、月のデータを抽出する。
最後に、合計金額を右上にでも計算させる。

ですかね。
    • good
    • 0

たぶん。



やりたいことはVBA使わなくてもできるような気がします。
表の作り方(データの並び順など)を工夫すれば、VLOOKUP関数やIF関数、SUM関数なんかを駆使するだけで、目的の請求書を作れる「可能性はあります」。

なぜ、このような曖昧な言い方になるかというと、No1.のご回答でも指摘があるように、具体的な要件が何も書かれていないからです。

せめて、元となる表や請求書のハードコピーを貼り付けるくらいはしれくれないと、どんなExcel達人でも回答できないでしょう。
    • good
    • 0

> マクロやVBはど素人です。


それでは無理です。そもそもこの説明ではマクロの組みようもありませんし。
「~したい」ばかりで「どこに」「何が」「どのように」が全く説明されていま
せん。

想像で補って回答したところで あなたに VBAの知識がないなら(マクロと VBA
の区別すら付いてない時点で 基本的な勉強が全く足りていないことは明白です)
作ってもらったマクロを自分の表に合わせて修正できないでしょう。

自分である程度でもチャレンジしてみて どんなに拙くても作ったコードを提示し
て「ここでこんなエラーが出てしまいます」と質問してくるなら まだ少しずつで
も上達の見込みがあると思うのですが 丸投げではそれも期待できません。

マクロに拘るなら 初心者レベルでもいいので自分でプログラムを作れるくらいに
なってから質問なさった方がいいように思います。「そのくらいはできる!」と
いうなら こんなサンプル作成依頼みたいな質問ではダメなことも分かりますよね?
    • good
    • 0

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

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

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

Q【エクセル VBA】 VBAを使って複数のCSVを結合させたいのですが、コンマ区切りの値がデータ上に

【エクセル VBA】

VBAを使って複数のCSVを結合させたいのですが、コンマ区切りの値がデータ上に存在するため上手くまとまりません。


コマンドでまとめる方法は知っているのですが、どうしてもVBAでやらなければならないので、その方法をご教授下さい。

また、結合するCSVはエクセルを開いた時に選択できるようにしたいです。
(特定のファイル上を対象では無く。)



説明が分かり辛いかもしれませんがよろしくお願いします。

Aベストアンサー

こんにちは

CSVには統一された規格がないので、細部について(コーテーションの種類やコーテーション内でのコーテーションの扱いなど)はいろいろ異なるルールがあり得ます。

対象がどのようなルールのデータなのかによるところは大きいですが…
エクセルでそのまま読み込める形式のCSVであるなら、No2様がおっしゃっているように、エクセルに読み込ませるというVBAを作成するのが簡単でしょう。
読み込めさえすれば、あとは統合処理だけなので比較的簡単だと思います。

エクセルで直接は読み込めないようなルールのデータの場合は、
>コマンドでまとめる方法は知っているのですが~~
とのことなので、手順ははっきりしているのでしょうから、対象のCSVをテキストで読み込み、文字列操作によってその手順で処理を行なえば解釈ができるものと思います。

>また、結合するCSVはエクセルを開いた時に選択できるようにしたいです。
どこかのセルにファイルを指定(記入)したうえでVBAを実行するか、VBAからファイル選択のダイアログを表示して選択させるなどの方法が考えられると思います。

こんにちは

CSVには統一された規格がないので、細部について(コーテーションの種類やコーテーション内でのコーテーションの扱いなど)はいろいろ異なるルールがあり得ます。

対象がどのようなルールのデータなのかによるところは大きいですが…
エクセルでそのまま読み込める形式のCSVであるなら、No2様がおっしゃっているように、エクセルに読み込ませるというVBAを作成するのが簡単でしょう。
読み込めさえすれば、あとは統合処理だけなので比較的簡単だと思います。

エクセルで直接は読み込めないようなルー...続きを読む

Qエクセルで 異なるデータを含む2つのデータを 1つの表にまとめる方法を教えてください

初めて質問をします。
あまりエクセルが詳しくなく わからないので 教えて下さい。

2つのデータがあります。
Aには仕入れ数、Bには売り上げ数があります。
双方の商品名はすべて一致するわけではなく、「AにあってBにない」「BにあってAがない」ものもあります。


    データA 【仕入れ】     データB 【売上】

管理No 商品  仕入れ数   管理No 商品   売上数
   1  りんご  3        2  みかん  8
   2  みかん  8       3    バナナ    3
   3  バナナ    4      1  りんご    2
   4  いちご    1      7   もも     3
   5  オレンジ  3      10    キウイ     2
   6  レモン    3     11    ぶどう     2
   7  もも     3     13    大根      1
   8  なし     2
   9  カキ    5
  10  キウイ  2
  11  ぶどう    1
  12   マンゴー   1


上記の2つのデータを以下のようにまとめたいのですが 可能でしょうか?
(ABすべての商品名を出して それぞれの数を表示する)

管理No   商品    仕入れ数      売上数
   1   りんご      3        2
   2   みかん      8      8
    3   ばなな      4        3
   4   いちご      1        0
   5    オレンジ  3        0
   6   レモン      3     0
   7   もも       3     3
   8   なし       2     0
   9   カキ      5     0
   10   キウイ      2      2
   11   ぶどう      1       2
   12   マンゴー    1      0
   13   大根      0      1
      


数字がずれていてすみません。
どうぞよろしくお願いします。

初めて質問をします。
あまりエクセルが詳しくなく わからないので 教えて下さい。

2つのデータがあります。
Aには仕入れ数、Bには売り上げ数があります。
双方の商品名はすべて一致するわけではなく、「AにあってBにない」「BにあってAがない」ものもあります。


    データA 【仕入れ】     データB 【売上】

管理No 商品  仕入れ数   管理No 商品   売上数
   1  りんご  3        2  みかん  8
   2  みかん  8       ...続きを読む

Aベストアンサー

こんにちは!

>(ABすべての商品名を出して それぞれの数を表示する)
というコトですので、手っ取り早くVBAでの一例です。

↓の画像のようにそれぞれのシート名は「仕入れ」・「売上」となっていて、Sheet3に表示するとします。
尚、「商品」の「管理No」はシリアルナンバーのように決まっているものとします。
そして、Sheet3の1行目項目行は入力済みという前提です。

Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻り(VBE画面を閉じて)マクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub Sample1() '//この行から//
Dim i As Long, lastRow1 As Long, lastRow2 As Long, lastRow3 As Long
Dim c As Range, r As Range
Dim wS1 As Worksheet, wS2 As Worksheet
Set wS1 = Worksheets("仕入れ")
Set wS2 = Worksheets("売上")
Application.ScreenUpdating = False
With Worksheets("Sheet3") '//←「Sheet3」はまとめるシート名に!"//
lastRow3 = .Cells(Rows.Count, "A").End(xlUp).Row
If lastRow3 > 1 Then
Range(.Cells(2, "A"), .Cells(lastRow3, "D")).ClearContents
End If
.Range("E:F").Insert
lastRow1 = wS1.Cells(Rows.Count, "A").End(xlUp).Row
Range(wS1.Cells(1, "A"), wS1.Cells(lastRow1, "A")).Copy .Range("E1")
lastRow2 = wS2.Cells(Rows.Count, "A").End(xlUp).Row
Range(wS2.Cells(2, "A"), wS2.Cells(lastRow2, "A")).Copy .Cells(Rows.Count, "E").End(xlUp).Offset(1)
.Range("E:E").AdvancedFilter Action:=xlFilterCopy, copytorange:=.Range("F1"), unique:=True
.Range("F:F").Sort key1:=.Range("F1"), order1:=xlAscending, Header:=xlYes
lastRow3 = .Cells(Rows.Count, "F").End(xlUp).Row
Range(.Cells(2, "F"), .Cells(lastRow3, "F")).Copy .Range("A2")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
Set c = wS1.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
.Cells(i, "B") = c.Offset(, 1)
.Cells(i, "C") = c.Offset(, 2)
End If
Set r = wS2.Range("A:A").Find(what:=.Cells(i, "A"), LookIn:=xlValues, lookat:=xlWhole)
If Not r Is Nothing Then
If .Cells(i, "B") = "" Then
.Cells(i, "B") = r.Offset(, 1)
End If
.Cells(i, "D") = r.Offset(, 2)
End If
Next i
.Range("E:F").Delete
.Columns.AutoFit
End With
Application.ScreenUpdating = True
MsgBox "完了"
End Sub '//この行まで//

※ 関数でないので、データ変更があるたびにマクロを実行する必要があります。

※ コード内の「Sheet3」の部分は実際のシート名に変更してください。m(_ _)m

こんにちは!

>(ABすべての商品名を出して それぞれの数を表示する)
というコトですので、手っ取り早くVBAでの一例です。

↓の画像のようにそれぞれのシート名は「仕入れ」・「売上」となっていて、Sheet3に表示するとします。
尚、「商品」の「管理No」はシリアルナンバーのように決まっているものとします。
そして、Sheet3の1行目項目行は入力済みという前提です。

Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → ...続きを読む

Qマクロで行挿入

エクセルでマクロを使って18行ごともしくは24行ごとに行を挿入し挿入したセルに「確定商品」の様にコメントを入れてそれをA1からA2、A3・・・と下に向かって行挿入を繰り返したいのですが、
マクロを使えば可能でしょうか?
※コメントは同じものを使います。

宜しくお願い致します。

Aベストアンサー

こんにちは!

>18行ごともしくは24行ごとに行を挿入し・・・

行挿入・行削除等を行う場合、最終行から上に遡って操作するのが間違いが少ない方法です。
データ数がきっちり18や24で割り切れる数であればそのようなことが可能ですが、
そうでない場合はかなり厄介です。

仮にA列のデータ数が18できっちり割り切れる場合のコードは

Sub Sample1()
Dim i As Long
For i = Cells(Rows.Count, "A").End(xlUp).Row - 17 To 1 Step -18
Rows(i).Insert
Cells(i, "A") = "確定商品"
Next i
End Sub

としても大丈夫だと思います。

※ 個人的には別の方法で

Sub Sample2()
Dim i As Long, lastRow As Long, myRng As Range
Set myRng = Range("A1") '//←最初の行を格納しておく//
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row Step 18
Set myRng = Union(myRng, Cells(i, "A"))
Next i
myRng.EntireRow.Insert
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Range(Cells(1, "A"), Cells(lastRow, "A")).SpecialCells(xlCellTypeBlanks).Value = "確定商品"
End Sub

のような感じでやる方が良いと思います。m(_ _)m

こんにちは!

>18行ごともしくは24行ごとに行を挿入し・・・

行挿入・行削除等を行う場合、最終行から上に遡って操作するのが間違いが少ない方法です。
データ数がきっちり18や24で割り切れる数であればそのようなことが可能ですが、
そうでない場合はかなり厄介です。

仮にA列のデータ数が18できっちり割り切れる場合のコードは

Sub Sample1()
Dim i As Long
For i = Cells(Rows.Count, "A").End(xlUp).Row - 17 To 1 Step -18
Rows(i).Insert
Cells(i, "A") = "確...続きを読む

Q【エクセル VBA】CSVファイルの結合

以前同じ質問をさせて頂いたのですが、説明不足であったため再投稿いたします。

【エクセル VBA】
VBAを使って複数のCSVを結合させたいのですが、コンマ区切りの値がデータ上に存在するため上手くまとまりません。

バッチ等でまとめる方法ではなく、どうしてもVBAでやらなければならないので、その方法をご教授下さい。

また、結合するCSVはエクセルを開いた時に選択できるようにしたいです。
(特定のファイル上を対象等では無く。)



現在使用しているVBAは以下のものになります。
-----------------------------------------------------

Sub CsvIn()
'CSVファイルの読み込み
Dim CsvFileName As Variant
Dim Li As String
Dim Bf() As String
Dim R As Long
Dim ShMain As Worksheet
Dim FlNo As Integer
Dim FFlNo As Integer

With ThisWorkbook 'シート&パスの設定
Set ShMain = .Worksheets("Sheet1")
ChDrive .Path
ChDir .Path
End With
'複数のファイルの選択を可に設定
CsvFileName = Application.GetOpenFilename _
(filefilter:="CSVファイル(*.csv),*.csv", _
Title:="CSVファイル選択", MultiSelect:=True)
If VarType(CsvFileName) = vbBoolean Then Exit Sub 'キャンセル時の処置
R = 1 '行の初期値
For FlNo = 1 To UBound(CsvFileName) 'ファイル数分ループ
FFlNo = FreeFile '---使用可能なファイル番号取得
Open CsvFileName(FlNo) For Input As #FFlNo
Do Until EOF(FFlNo) '最終行までループ
Line Input #FFlNo, Li '一行読み込み
Bf = Split(Li, ",") 'カンマで分割し配列に代入
If UBound(Bf) >= 0 Then '空白行の処理を飛ばす
With ShMain '1行分のデータをセルに出力
.Range(.Cells(R, 1), Cells(R, UBound(Bf) + 1)).Value = Bf
End With
End If
R = R + 1
Loop
Close #FFlNo
Next FlNo
End Sub

-----------------------------------------------

参考になりそうなサイト
http://excel-ubara.com/excelvba5/EXCELVBA257.html



よろしくお願いします。

以前同じ質問をさせて頂いたのですが、説明不足であったため再投稿いたします。

【エクセル VBA】
VBAを使って複数のCSVを結合させたいのですが、コンマ区切りの値がデータ上に存在するため上手くまとまりません。

バッチ等でまとめる方法ではなく、どうしてもVBAでやらなければならないので、その方法をご教授下さい。

また、結合するCSVはエクセルを開いた時に選択できるようにしたいです。
(特定のファイル上を対象等では無く。)



現在使用しているVBAは以下のものになります。
------------...続きを読む

Aベストアンサー

No.13 に対する補足コメントについて

ですから!
そのダメな所のデータを数行抜き出したものでCSVファイルを作成して実験してみてください。
それでも症状が出るならばその数行のデータを提示してください。

大変申し訳ないのですが、こちらはそちらの状況が見えないので「特段ルールが異なるようなことはございませんでした。」は、あなたが気づかないだけの場合が多いのでそれを提示していただきたいのです。
「同じ列に似た値があると上書かれてしまうということはありませんでしょうか?」については1文字ずつ「"」「,」が有った時だけ特別な作業をしているだけなので考えにくいです。

もしかしての考えられそうなものとして
・文字コードのせいで1つの2バイト文字が「"」や「,」と何かに分解されてしまっている可能性も有るかもしれません。
・1つの行中で「"」が偶数個でないと誤動作する可能性はあります。
・CSVファイルに特殊な制御コードになりそうな文字が含まれている。
・これは故意にしているのですが空白だけの行は削除していますが問題ないですよね?

とにかく、こちらではそちらの状況が見えないので、ダメな状況を具体的に提示していただけないと実験などが出来ないのです。もしも具体的な提示が出来ないのならばそう言ってください。あなたの事は無視するようにします。
よろしくお願いいたします。

No.13 に対する補足コメントについて

ですから!
そのダメな所のデータを数行抜き出したものでCSVファイルを作成して実験してみてください。
それでも症状が出るならばその数行のデータを提示してください。

大変申し訳ないのですが、こちらはそちらの状況が見えないので「特段ルールが異なるようなことはございませんでした。」は、あなたが気づかないだけの場合が多いのでそれを提示していただきたいのです。
「同じ列に似た値があると上書かれてしまうということはありませんでしょうか?」については1文...続きを読む

QExcel VBAについて

同じブックに集計シートと報告書シートがあります。
集計シートには日付の一覧
報告書シートは日付毎にあり
報告書シートの
D2には日付
D5には個数
が記載されており、報告書を記入後ブックを閉じよう(Before Close)とすると集計シートから同じ日付を検索し、検索した日付の4つ下のセルに報告書シートのD5の個数を記入するようにしたいのですが上手くいきません。

現在は下記のように作っております。
ですが上手く動いてくれません。
どのようにしたらよいのでしょうか?
すみませんがよろしくお願いいたします。

  Dim Ran As Range
Dim Rn As Range

  Set Ran = ActiveSheet.Range("D2")
Set Rn = Sheets("集計").Range("C14:AH144").Find(Ran)
Rn.Offset(0, 4).Value = ActiveSheet.Range("D5").Value

Aベストアンサー

No.1です。

質問文では
>検索した日付の4つ下のセルに・・・
とありますので、

>Rn.Offset(4).Value = ActiveSheet.Range("D5").Value
としたらどうでしょうか?
※ Offset(0, 4) とすると4列右側のセルになります。

丁寧に書けば
Offset(4)はOffset(4,0) になります。

余計なお世話かもしれませんが、
おそらく操作したいSheetをアクティブにしてマクロを実行されるコードだと思いますので、
>Rn.Offset(4)= Range("D5")

だけでも動くと思います。m(_ _)m

Q月間勤務表から1日~31日までの各日付ごとに出勤している職員を書き出す方法

月間勤務表から週間勤務表をつくるのに、出勤している職員を抽出して自動かしたいので
手始めに1日~31日までの各日付ごとに職員を抽出する方法を考えたのですがVLOOKUPは使えなさそうなので何かほかの
方法はない物かと、模索していましたが行き詰ってしまいました。
皆様のお力おかしください。

添付した画像が私が使っているエクセルで作製した月間勤務表となります。名前の列に
8・5・7.5が記入してあるのが出勤という意味です、⑧は有給で研は研修と言う意味です。

抽出した名前は別シートに貼り付けたいと思っております。
説明の至らぬ点が多々あるとは思いますが、宜しくお願い致します。

Aベストアンサー

続けてお邪魔します。

>0と表示される個所が所々ありました・・・
「0」が表示されるのは対象セルが空白の場合にそのようになります。

ん~~~
お示しの画像の配置だとかなり厄介ですね。
画像を拝見して、「月間シフト貼り付け」シートのC列氏名は41行目までだと解釈しました。
かなり強引にやってみました。

Sheet2(日付ごと出勤名簿)のA2セルに
=IFERROR(INDEX(月間シフト貼り付け!$C$7:$C$41,SMALL(IF((月間シフト貼り付け!$C$7:$C$41<>"")*(NOT(ISNUMBER(FIND("計",月間シフト貼り付け!$C$7:$C$41))))*((月間シフト貼り付け!F$7:F$41=8)+(月間シフト貼り付け!F$7:F$41=5)+(月間シフト貼り付け!F$7:F$41=7.5)),ROW($A$7:$A$41)-6),ROW(A1))),"")

前回同様、配列数式なのでCtrl+Shift+Enterで確定し
フィルハンドルで列・行方向にコピーしてみてください。

※ 万一、C列氏名に 「計」が含まれる名前(たとえば「加計学園」など)のセルは無視されてしまいます。

※ 本来であればC列(名前列)には名前以外の項目を入れない方が簡単です。m(_ _)m

続けてお邪魔します。

>0と表示される個所が所々ありました・・・
「0」が表示されるのは対象セルが空白の場合にそのようになります。

ん~~~
お示しの画像の配置だとかなり厄介ですね。
画像を拝見して、「月間シフト貼り付け」シートのC列氏名は41行目までだと解釈しました。
かなり強引にやってみました。

Sheet2(日付ごと出勤名簿)のA2セルに
=IFERROR(INDEX(月間シフト貼り付け!$C$7:$C$41,SMALL(IF((月間シフト貼り付け!$C$7:$C$41<>"")*(NOT(ISNUMBER(FIND("計",月間シフト貼り付け!$C$7:$C$41)))...続きを読む

QIF関数 複数条件の組み合わせ

いつもご教授いただきましてありがとうございます。

今回IF関数の複数条件についてご教授頂ければ幸いです。

サンプル画像添付しましたように
D列の作業列③に下記条件が一致したら数字を表示させる数式を組みたいです。
IF、OR関数の組み合わせだと思うのですが、複数条件の組み方が苦手なので
質問させていただきました。

①A列の数字の中でが2(B列商品コードの最初の数字)
  C列の数字の中で04、51、03(B列商品コードの下2桁)だったら1と表示させたい。
※ちなみにC列の条件数値は今後いくつか増える可能性があります。その場合もどういう式にしたらよいか併せてご教授願います。

②A列の数字の中でが2(B列商品コードの最初の数字)
  C列の数字の中で04、51、03(B列商品コードの下2桁)以外だったら2と表示させたい。

③A列の数字の中でが9(B列商品コードの最初の数字)だったら空白にしたい。

お手数をおかけいたしますが、何卒、ご教授願います。

Aベストアンサー

こんにちは!

せっかく作業用の列①・②を作っていらっしゃいますが、一気にC列に表示する数式にしてみました。

C2セルに
=IF(B2="","",IF(LEFT(B2,1)*1=2,IF(ISNUMBER(FIND(RIGHT(B2,2),"04,51,03")),1,2),""))

という数式を入れフィルハンドルで下へこれ以上データが増えることはない!という位まで
しっかりコピーではどうでしょうか?m(_ _)m

Q共有フォルダからのファイル名抽出(VBA)

以前、同様の質問をしたのですが、共有フォルダからファイル名+更新日の抽出する方法をご教示しただいたのですが、30分以上かかっても終わりませんでした・・・・(数が10000以上あるからかと思いますが。。。。)教えていただいたのに申し訳ありません。。。

改めて、更新日は不要にして、ある共有フォルダからファイル名をエクセルに出力する方法を教えていただけませんでしょうか?

B1セルには"ファイル名"というTITELが入っているので
B2セルより下(B2、B3、B4~)にファイル名を記載していくような構文です。
※Dir関数、もしくはそれより早い方法があれば、そちらでも構いません。

よろしくお願いします。

Aベストアンサー

No1です。先のファイルを自分のPCに保存
buf = Dir(ThisWorkbook.Path & "\*.xlsx")
の部分を
buf = Dir(”共有フォルダのパス” & "\*.xlsx")
に変更してみて下さい。

QVBAでリストから表を作りやり方を教えてください

VBA初心者です。
標題のやり方を教えてください。
B列に日付、C列に時間、D列にデータがあるリストが有ります(データ数1000以上)
B列は、最高で14日間、C列は同じ時間が毎日あります。(同じ時間の繰り返し)
同シート別セル(例えばM1)に別の縦軸に時間を、横軸に日付の表を作成し、
その交差する場所にデータが来るようなものをVBAで作れないかと思うのですが、いかがでしょうか
ご存知の方、教えてください
宜しくお願いします

Aベストアンサー

こんばんは!

元データはSheet1にあり、Sheet2のM1セル以降に表示するとします。
画像通り、Sheet1のデータは3行目以降にあるとします。
今回はオートフィルタを使っていますので、Sheet1の2行目は何らかの項目名が入っているという前提です。
画像では項目名が入っていませんが、ダミーでも良いので項目を入れておいてください。

標準モジュールです。

Sub Sample1()
Dim i As Long, k As Long, lastRow As Long
Dim lastCol As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
lastRow = wS.Cells(Rows.Count, "M").End(xlUp).Row
lastCol = wS.Cells(1, Columns.Count).End(xlToLeft).Column
Application.ScreenUpdating = False
If lastCol > 12 Then
Range(wS.Cells(1, "M"), wS.Cells(lastRow, lastCol)).Clear
End If
With Worksheets("Sheet1")
lastRow = .Cells(Rows.Count, "B").End(xlUp).Row
Range(.Cells(2, "B"), .Cells(lastRow, "B")).AdvancedFilter Action:=xlFilterCopy, copytorange:= _
wS.Range("M1"), unique:=True
For i = 3 To lastRow
If .Cells(i, "B") > .Cells(i - 1, "B") Then Exit For
.Cells(i, "C").Copy wS.Cells(1, Columns.Count).End(xlToLeft).Offset(, 1)
Next i
For k = 2 To wS.Cells(Rows.Count, "M").End(xlUp).Row
.Range("B:B").AutoFilter field:=1, Criteria1:=Format(wS.Cells(k, "M"), "yyyy/m/d") '//←表示形式に注意★//
Range(.Cells(3, "D"), .Cells(lastRow, "D")).SpecialCells(xlCellTypeVisible).Copy
wS.Cells(k, "N").PasteSpecial Paste:=xlPasteAll, Transpose:=True
Next k
.AutoFilterMode = False
wS.Range("M1").CurrentRegion.Columns.AutoFit
wS.Activate
wS.Range("M1").Select
Application.ScreenUpdating = True
MsgBox "完了"
End With
End Sub

※ 日付のフィルタはかなり厄介です。
コード内に記載している「★」の行のようにSheet1のB列(日付列)の表示形式は
実際の表示形式に合わせてください。m(_ _)m

こんばんは!

元データはSheet1にあり、Sheet2のM1セル以降に表示するとします。
画像通り、Sheet1のデータは3行目以降にあるとします。
今回はオートフィルタを使っていますので、Sheet1の2行目は何らかの項目名が入っているという前提です。
画像では項目名が入っていませんが、ダミーでも良いので項目を入れておいてください。

標準モジュールです。

Sub Sample1()
Dim i As Long, k As Long, lastRow As Long
Dim lastCol As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
las...続きを読む

Q【エクセル 顧客管理】 顧客の2回目の購入月の抽出

エクセルで顧客管理を行なっております。
各顧客の初回購入月、2回目の購入月、最終購入月を抽出できないか、質問させて頂きました。

以下のような表の中から、初回購入月をI欄に、2回目をJ欄に、最終購入月をK欄に抽出したいと思います。

 A    B   C   D   E   F   G   H   I    J    K
顧客NO (1月) (2月) (3月) (4月) (5月) (6月)  合計 初回  2回目   最終
a001   1000 2000 3000            6000
a002   5000    6000 7000         18000
a003   7500    8500 9500 10000     35500


できれば関数だけを使って管理できればと思っております。どうぞ宜しくお願い致します。

Aベストアンサー

こんばんは!

お示しの配置通りだとするとI2セルに
=IFERROR(INDEX($B$1:$G$1,SMALL(IF($B2:$G2<>"",COLUMN($B$1:$G$1)-1),COLUMN(A1))),"")

配列数式なのでCtrl+Shift+Enterで確定! → I2セルのフィルハンドルで隣りのJ2セルまでフィル&コピー!

K2セルの数式は別の数式になります。
=IF(COUNT(B2:G2),INDEX(B$1:G$1,MAX(IF(B2:G2<>"",COLUMN(B$1:G$1)-1))),"")

こちらも配列数式なので、同様にCtrl+Shift+Enterで確定!

最後にI2~K2セルを範囲指定 → K2セルのフィルハンドルで下へコピーしてみてください。m(_ _)m


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

人気Q&Aランキング