質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

468閲覧

VBAで複数のセルの中から特定の値がA列に入っているもののみを抽出したい

porpora_0316

総合スコア37

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/05/01 07:32

編集2020/05/01 07:53

以下のようなExcelから各商品分類の区分名の中の売上額、利益額、数量のみをFor文よりも時間がかからず取り出すことは可能ですか?
今のやり方は一回目のfor文で(名前1)~(名前n)までを回し、二回目のfor文で行を回し、区分名が売上額、利益額、数量のどれかであれば別のシート(『まとめ』という名前です)に書き込むというようにしています。
しかし、このやり方では重いらしくたまに落ちてしまいます。
もし、もっと簡単もしくは重くないやり方などあればご教授いただければ幸いです。
*人の数や名前は変化するため、1~nにしてあります。始まりは変わらずN列からなのですが、終わりは増えたり減ったりする可能性もあります
一応自身の目的など分かりやすく書いたつもりではありますが、もしわかりにくかったら申し訳ございません。

[作成元のExcelシート]
|L|M|N|...|S|X|
|:--|:--:|:--:|:--:|
|分類名|区分名|(名前1)|...|(名前n)|計|
|(分類1)|売り上げ額|
| |利益額|
| |利益率|
| |数量|
| |平均原価|
|(分類2)|売り上げ額|
| |利益額|
| |利益率|
| |数量|
| |平均原価|

VBA

1Sub 作成 2Dim i As Integer 3Dim j As Integer 4Dim saigo As Integer '人の最終列 5Dim num As Integer 6 7'人の名前がどこからどこまでかを確認 8For i = 14 To Sheets(1).Cells(6,Columns.count).End(xlToLeft).Column 9 If Sheets(1).Cells(6,i) = "計" Then 10 saigo = i-1 11 End If 12Next 13 14'まとめシートに値を入れる 15For i = 14 TO saigo 16 For j = 1 To Sheets(1).Cells(Rows.count,i).End(xlUp).Row 17 'エラーもしくは空白の場合セルに0を入れる 18 If Sheets(1).Cells(j,i) = "" Or IsError(Sheets(1.Cells(j,i)) Then 19 Sheets(1).Cells(j,i) = 0 20 EndIf 21 22 If Sheets("まとめ").Cells(1,1) = "" Then 23 Sheets("まとめ").Cells(1,1) = Sheets(1).Cells(12,i) 24 Sheets("まとめ").Cells(1,2) = Sheets(1).Cells(13,i) 25 Sheets("まとめ").Cells(1,3) = Sheets(1).Cells(12,i) 26 Else 27 num = Sheets("まとめ").Cells(Rows.count,1).End(xlUp).Row + 1 28 Sheets("まとめ").Cells(num,1) = Sheets(1).Cells(j,i) 29 Sheets("まとめ").Cells(num,2) = Sheets(1).Cells(j,i) 30 Sheets("まとめ").Cells(num,3) = Sheets(1).Cells(j,i) 31 End If 32 Next 33Next 34Next 35End Sub

[最終的に出来て欲しい内容(まとめシート)]

ABC
(分類1)(名前1)売上額
(分類1)(名前1)利益額
(分類1)(名前1)数量
(分類2)(名前1)売上額
(分類2)(名前1)利益額
(分類2)(名前1)数量
.(名前1)数量
.(名前1)数量
.(名前1)数量
(分類1)(名前n)売上額
(分類1)(名前n)利益額
(分類1)(名前n)数量
(分類2)(名前n)売上額
(分類2)(名前n)利益額
(分類2)(名前n)数量

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

すいません自己解決してしまいました
計の一つ手前をFindで取得しAutoFilterで三項目のみを取得することにしました。
案をだしてくださってありがとうございます。これからの資料作成に役立てたいと思います。

投稿2020/05/03 02:28

porpora_0316

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちはこんばんは、よろしくおねがいいたします。

たぶん・・私の理解が不足していると思うので、下記のアイディアはご期待に沿ってないかもしれませんが・・ご参考になさってください。

「"計"の文字が出現するいっこ前まで繰り返す」部分の動作は、do while loopを使いました。

下記のサンプルコードで私のほうでは動作確認できました。

VBA

1Option Explicit 2 3Sub Tenki() 4'作成元シートからまとめシートに転記するVBAです 5 6Dim SakuseimotoSheet As Worksheet 7Dim MatomeSheet As Worksheet 8'作成元シートは、”作成元.xlsx"の"Sheet1"であるとします 9'まとめシートは、このワークブックの"Sheet1"であるとします 10'このVBAは、このワークブック(まとめシートがあるブック)にあるものとします 11'作成元.xlsxはすでに開かれているものとします 12 13Set SakuseimotoSheet = Workbooks("作成元").Worksheets("sheet1") '作成元シートを定義します 14Set MatomeSheet = ThisWorkbook.Worksheets("Sheet1") 'まとめシートを定義します 15 16Dim i As Long '作成元シート側にて、列番号を制御する変数です 17Dim j As Long 'まとめシート側にて、印字する行番号を制御する変数です 18 19i = 14 '作成元シートの1行目の名前のサーチは14列目(L列)からスタートします 20j = 1 'まとめシートへの転記は1行目からスタートします 21 22Dim Namae, Bunrui_1, Uriagegaku_1, RiekiGaku_1, Suryo_1 As String '各アイテムを格納する変数です 23Dim Bunrui_2, Uriagegaku_2, RiekiGaku_2, Suryo_2 As String '各アイテムを格納する変数です 24 25Do While SakuseimotoSheet.Cells(6, i) <> "計" '「計」という文字列に当たるまで繰り返します 26 '作成元シートから、各アイテムの値を得ます 27 With SakuseimotoSheet 28 Namae = .Cells(6, i).Value 29 Bunrui_1 = .Cells(7, 12).Value '分類1の名称は、このセルに固定で存在しているので、これでいいと思います 30 Uriagegaku_1 = .Cells(7, i).Value 31 RiekiGaku_1 = .Cells(8, i).Value 32 Suryo_1 = .Cells(10, i).Value 33 Bunrui_2 = .Cells(12, 12).Value '分類2の名称は、このセルに固定で存在しているので、これでいいと思います 34 Uriagegaku_2 = .Cells(12, i).Value 35 RiekiGaku_2 = .Cells(13, i).Value 36 Suryo_2 = .Cells(15, i).Value 37 End With 38 39 '各アイテムの値を、まとめシートに転記します 40 '分類1と分類2の2分類があって、それぞれの売上額・利益額・数量の3要素があるので、 41 '結果的に2x3=6要素を単純にひとかたまりととらえて、いっぺんに転記させます 42 43 With MatomeSheet 44 .Cells(j, 1) = Bunrui_1 45 .Cells(j, 2) = Namae 46 .Cells(j, 3) = Uriagegaku_1 47 48 .Cells(j + 1, 1) = Bunrui_1 49 .Cells(j + 1, 2) = Namae 50 .Cells(j + 1, 3) = RiekiGaku_1 51 52 .Cells(j + 2, 1) = Bunrui_1 53 .Cells(j + 2, 2) = Namae 54 .Cells(j + 2, 3) = Suryo_1 55 56 .Cells(j + 3, 1) = Bunrui_2 57 .Cells(j + 3, 2) = Namae 58 .Cells(j + 3, 3) = Uriagegaku_2 59 60 .Cells(j + 4, 1) = Bunrui_2 61 .Cells(j + 4, 2) = Namae 62 .Cells(j + 4, 3) = RiekiGaku_2 63 64 .Cells(j + 5, 1) = Bunrui_2 65 .Cells(j + 5, 2) = Namae 66 .Cells(j + 5, 3) = Suryo_2 67 End With 68 69 j = j + 6 ' まとめシート側で6行送ります 70 i = i + 1 '作成シート側で1列右に移動します 71 72Loop 73 74End Sub 75 76

投稿2020/05/02 15:36

編集2020/05/02 15:38
AkiSaito

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

すみません、質問です
「まとめシート」の出力行はどこでカウントアップしていますか?

行2(分類1) (名前1) 売上額
行3(分類1) (名前1) 利益額

と出力されることになっていますが、行の2,3...とカウントアップしている変数はどこでしょう。

投稿2020/05/01 07:46

taro373

総合スコア189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

porpora_0316

2020/05/01 07:53

分かりにくくて申し訳ございません まとめシートの出力行は、num = Sheets("まとめ").Cells(Rows.count,1).End(xlUp).Row+1で最終行の次の行を取得することでカウントアップしています(A1が空白の場合はA1から値を入れ、それ以外の場合は最終行の次の行に値を入れる)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問