Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2412 / 13645 ツリー ←次へ | 前へ→

【68157】VBAソースコードについて VBA初心者 11/2/7(月) 13:44 質問[未読]
【68158】Re:VBAソースコードについて kanabun 11/2/7(月) 14:45 発言[未読]
【68159】Re:VBAソースコードについて VBA初心者 11/2/7(月) 15:08 質問[未読]
【68160】Re:VBAソースコードについて kanabun 11/2/7(月) 15:27 発言[未読]
【68163】Re:VBAソースコードについて kanabun 11/2/8(火) 10:15 発言[未読]
【68170】Re:VBAソースコードについて VBA初心者 11/2/8(火) 15:48 お礼[未読]
【68179】Re:VBAソースコードについて kanabun 11/2/9(水) 20:12 発言[未読]
【68161】Re:VBAソースコードについて UO3 11/2/7(月) 17:39 発言[未読]

【68157】VBAソースコードについて
質問  VBA初心者  - 11/2/7(月) 13:44 -

引用なし
パスワード
   VBAの初心者です。下記入力ファイルを取り込んで、出力ファイルを出すプログラムの書き方について、お伺いしたいですが、ご存知の方是非教えてくださいませ。

入力ファイル1.:
1 A B C D E  F  G   H   I   J K L M N O P Q R
2      code 役職 社員No 名前 tscode 1W 2W 3W 4W 5W 6W
3       A1 部長 0001  高橋 A001  1 0  1 2 0 2
4      A1 部長 0002  吉田 B001  2 0  3 4 1 0
5      A1 部長 0001  高橋 A001  2 2  3 2 1 3
6      C1 課長 0004  鈴木 D001  0 3  4 3 1 0
7      E1 社員1 0005  渡辺 E001  4 2  4 4 1 2
8      E1 社員1 0006  長谷川F001  0 2  1 4 3 3
9      G1 社員2 0007  川本 G001  2 3  4 1 0 2
10      G1 社員2 0008  安田 H001  4 2  0 2 4 2
11      G1 社員2 0007  川本 H001  2 0  4 2 3 1

出力ファイル2.: 
1  A  B  C   D  E   F   G   H  I  J   K  L  M  NO
2 code 役職 社員No 名前 week A001 B001 C001 D001 E001 F001 G001 H001 計
3 A1  部長 0001  高橋 1W  3  0  0  0  0  0  0  0  3
4 A1  部長 0001  高橋 2W  2  0  0  0  0  0  0  0  2
5 A1  部長 0001  高橋 3W  7  0  0  0  0  0  0  0  7
6 A1  部長 0001  高橋 4W  7  0  0  0  0  0  0  0  ・
7 A1  部長 0001  高橋 5W  2  0  0  0  0  0  0  0  ・
8 A1  部長 0001  高橋 6W  5  0  0  0  0  0  0  0  ・
9 A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
10A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
11A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
12 ・  ・  ・  ・  ・  ・  ・  ・  ・  ・  ・  ・ ・
13C1  課長 0004  鈴木 1W  ・  ・  ・  ・  ・  ・  ・
14 ・  ・  ・  ・  ・  ・  ・  ・
 
処理内容:
入力ファイルのXXXXシート(上記1.)を取込、ランダムの社員タイムシートチャージ情報を出力ファイルにYYYYYYYシート(上記2.)のようにまとめます。社員コードが変わったタイミングで背景色を変える。また、同一社員でもcodeが分かれれば、別集計する。

説明内容が分かりにくいかもしれませんが、
是非宜しく御願いいたします。

【68158】Re:VBAソースコードについて
発言  kanabun  - 11/2/7(月) 14:45 -

引用なし
パスワード
   ▼VBA初心者 さん:

>ファイルを取り込んで、出力ファイルを出すプログラムの書き方について

説明が端折ってあるとレスがつきにくいと思います。
せっかくの図表ですが、
>入力ファイル1.:

を処理すると、
>出力ファイル2.: 
>1  A  B  C   D  E   F   G   H  I  J   K  L  M  NO
>2 code 役職 社員No 名前 week A001 B001 C001 D001 E001 F001 G001 H001 計
>3 A1  部長 0001  高橋 1W  3  0  0  0  0  0  0  0  3
>4 A1  部長 0001  高橋 2W  2  0  0  0  0  0  0  0  2
>5 A1  部長 0001  高橋 3W  7  0  0  0  0  0  0  0  7
>6 A1  部長 0001  高橋 4W  7  0  0  0  0  0  0  0  ・
>7 A1  部長 0001  高橋 5W  2  0  0  0  0  0  0  0  ・
>8 A1  部長 0001  高橋 6W  5  0  0  0  0  0  0  0  ・
>9 A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
>10A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
>11A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
>12 ・  ・  ・  ・  ・  ・  ・  ・  ・  ・  ・  ・ ・
>13C1  課長 0004  鈴木 1W  ・  ・  ・  ・  ・  ・  ・
>14 ・  ・  ・  ・  ・  ・  ・  ・
> 

のように、どのようにしたらなるのでしょう?

数値出力列は あらかじめ決まっているということですか?
例だと、
tscode {A001 B001 C001 D001 E001 F001 G001 H001 計} で固定ですよね?

出力行は
社員の数だけ
week {1W 2W 3W 4W 5W 6W} の6行が出力シートに発生するのですか?


まずは、入力ファイルの表を「社員番号」で並び替えたもので、
再度 手作業での処理手順を説明されたほうがよいと思いますけど?

左端の行番号も ひとつずれていますよね?

VBAでやるときは、ソート後、基本的には配列内で処理を行うことになると
思います。

【68159】Re:VBAソースコードについて
質問  VBA初心者  - 11/2/7(月) 15:08 -

引用なし
パスワード
   kanabun さん 

質問を見ていただき、ありがとうございます。
質問の内容が煩わしく、申し訳ありません。

再度整理いたします。

出力ファイル2は空白のシートです。
入力ファイル1があって、そこに入力されている内容を新しいファイルに新しいシートを追加し、出力ファイル2(できたときのイメージです)のような内容を出力させる処理です。

入力ファイル1のデータはランダムに入力されています。処理後の新シートには各社員のweekごとにチャージコード別〔A001,B001,C001、、、、〕の時間合計を出力させます。

お手数をお掛けしますが、
宜しく御願いいたします。


▼kanabun さん:
>▼VBA初心者 さん:
>
>>ファイルを取り込んで、出力ファイルを出すプログラムの書き方について
>
>説明が端折ってあるとレスがつきにくいと思います。
>せっかくの図表ですが、
>>入力ファイル1.:
>
>を処理すると、
>>出力ファイル2.: 
>>1  A  B  C   D  E   F   G   H  I  J   K  L  M  NO
>>2 code 役職 社員No 名前 week A001 B001 C001 D001 E001 F001 G001 H001 計
>>3 A1  部長 0001  高橋 1W  3  0  0  0  0  0  0  0  3
>>4 A1  部長 0001  高橋 2W  2  0  0  0  0  0  0  0  2
>>5 A1  部長 0001  高橋 3W  7  0  0  0  0  0  0  0  7
>>6 A1  部長 0001  高橋 4W  7  0  0  0  0  0  0  0  ・
>>7 A1  部長 0001  高橋 5W  2  0  0  0  0  0  0  0  ・
>>8 A1  部長 0001  高橋 6W  5  0  0  0  0  0  0  0  ・
>>9 A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
>>10A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
>>11A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
>>12 ・  ・  ・  ・  ・  ・  ・  ・  ・  ・  ・  ・ ・
>>13C1  課長 0004  鈴木 1W  ・  ・  ・  ・  ・  ・  ・
>>14 ・  ・  ・  ・  ・  ・  ・  ・
>> 
>
>のように、どのようにしたらなるのでしょう?
>
>数値出力列は あらかじめ決まっているということですか?
>例だと、
>tscode {A001 B001 C001 D001 E001 F001 G001 H001 計} で固定ですよね?
>
>出力行は
>社員の数だけ
>week {1W 2W 3W 4W 5W 6W} の6行が出力シートに発生するのですか?
>
>
>まずは、入力ファイルの表を「社員番号」で並び替えたもので、
>再度 手作業での処理手順を説明されたほうがよいと思いますけど?
>
>左端の行番号も ひとつずれていますよね?
>
>VBAでやるときは、ソート後、基本的には配列内で処理を行うことになると
>思います。

【68160】Re:VBAソースコードについて
発言  kanabun  - 11/2/7(月) 15:27 -

引用なし
パスワード
   ▼VBA初心者 さん:

>再度整理いたします。
>
>入力ファイル1のデータはランダムに入力されています。

ランダムでは処理がしにくいから 社員No でまずはソートしてみたら?
ということなんですが?
ためしに、こちらで、ご提示の入力表を社員Noでソートしてみますと、
以下のようになります。

[E]  [F]  [G]  [H]  [I]  [J][K][L][M][N][O]
code 役職  社員No 名前 tscode 1W 2W 3W 4W 5W 6W
A1  部長  0001 高橋  A001  1 0 1 2 0 2
A1  部長  0001 高橋  A001  2 2 3 2 1 3
A1  部長  0002 吉田  B001  2 0 3 4 1 0
C1  課長  0004 鈴木  D001  0 3 4 3 1 0
E1  社員1 0005 渡辺  E001  4 2 4 4 1 2
E1  社員1 0006 長谷川 F001  0 2 1 4 3 3
G1  社員2 0007 川本  G001  2 3 4 1 0 2
G1  社員2 0007 川本  H001  2 0 4 2 3 1
G1  社員2 0008 安田  H001  4 2 0 2 4 2

川本さんの tscode が G001 のと H001のとありますが、
これでいいのでしょうか?

>処理後の新シートには各社員のweekごとにチャージコード別〔A001,B001,C001、、、、〕の時間合計を出力させます。
>出力ファイル2は空白のシートです。

>出力ファイル2(できたときのイメージです)のような内容を出力

くどくてすみませんですが、
上記の「社員No」でソート後の表の修正と、
修正後の正しいサンプル入力表にもとづく 出力表のただしい数値の入った
表のご提示をお願いします。

【68161】Re:VBAソースコードについて
発言  UO3  - 11/2/7(月) 17:39 -

引用なし
パスワード
   ▼VBA初心者 さん:

kanabunさんからのご質問に加えて


>出力ファイル2.: 
>1  A  B  C   D  E   F   G   H  I  J   K  L  M  NO
>2 code 役職 社員No 名前 week A001 B001 C001 D001 E001 F001 G001 H001 計
>9 A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
>10A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・
>11A1  部長 0002  吉田 1W  3  0  0  0  0  0  0  0  ・

なぜ吉田さんの1Wが3行あるのでしょうか?

【68163】Re:VBAソースコードについて
発言  kanabun  - 11/2/8(火) 10:15 -

引用なし
パスワード
   ▼VBA初心者 さん: こんにちは〜

質問者さんからの応答がありませんが、
しばらく参加できないので、レス入れときます。
回答ではありません。

要は、今現在 入力表のデータ入れ替え統合を(手作業で)どうやって
処理しているのか、ってことです。その手順を文章化できれば、それを
VBAのコードに直していけばいいのです。手作業でも、VBAでも、作業の
手順は変わらないですから。


Step1.
元のファイルの入力表の[E]列〜[O]列を このBookのSheet1の
[A1]にCopyし、「社員No」と「tscode」で昇順ソートします。
【Sheet1】
  [A]  [B]  [C]  [D]  [E]  [F][G][H][I][J][K]
[1] code 役職  社員No 名前 tscode 1W 2W 3W 4W 5W 6W
[2] A1  部長  0001 高橋  A001  1 0 1 2 0 2
[3] A1  部長  0001 高橋  A001  2 2 3 2 1 3
[4] A1  部長  0002 吉田  B001  2 0 3 4 1 0
[5] C1  課長  0004 鈴木  D001  0 3 4 3 1 0
[6] E1  社員1 0005 渡辺  E001  4 2 4 4 1 2
[7] E1  社員1 0006 長谷川 F001  0 2 1 4 3 3
[8] G1  社員2 0007 川本  G001  2 3 4 1 0 2
[9] G1  社員2 0007 川本  H001  2 0 4 2 3 1
[10] G1  社員2 0008 安田  H001  4 2 0 2 4 2

Step2.
あたらしいシートをこのBookに追加し、一行目にタイトルを
書き込みます。
【SheetNew】
[F1],[G1],.. のtscodeは 元の【Sheet1】の[E]列に Unique:=Trueで
フィルタオプションをかけ、得られた重複のないtscode一覧をソート
したものを行列入れ替えて[F1]にPasteSpecialすればいいと思います。
 変数WS1を【Sheet1】とし、
 変数WS2 を【SheetNew】のこととすると、
 WS1.[E1:E10].AdvancedFilter xlFilterCopy, _
      CopyToRange:=WS2.[E1], Unique:=True
で、
  [A]  [B]  [C]  [D]  [E]  [F][G][H][I][J][K]・・・
[1] code 役職  社員No 名前 tscode
[2]               A001
[3]               B001
[4]               D001
[5]               E001
[6]               F001
[7]               G001
[8]               H001
[9]              
[10]             
が得られますから、この範囲を(E列だけを)ソートして
[F1]にTranspose貼り付けします。
 Dim r As Range
 With WS2
  Set r = .range("E1",.range("E1").End(xlDown))
  r.Sort Key1:=.Columns(1),Header:=xlYes
  r.Copy
  .range("F1").PasteSpecial xlPasteValues, Transpose:=True
  Application.CutCopyMode = True
  r.ClearContents
 End With
の処理で、
【SheetNew】
  [A]  [B]  [C]  [D]  [E]  [F] [G] [H] [I] [J] [K] ・・・
[1] code 役職  社員No 名前    A001 B001 D001 E001 F001 G001 H001

となりますから、[E1]に"week"を代入して、タイトル行は完成です。


Step3.
【Sheet1】を上から順に処理していきます。
最初の社員番号は 「001」なので 2行目〜7行目にその社員の[A]列〜[D]列
をCOPYします。 またE列に 1W〜6W を代入します。
【SheetNew】
  [A]  [B]  [C]  [D]  [E]  [F] [G] [H] [I] [J] [K] ・・・
[1] code 役職  社員No 名前 Week A001 B001 D001 E001 F001 G001 H001
[2]  A1  部長  0001 高橋  1W
[3]  A1  部長  0001 高橋  2W
[4]  A1  部長  0001 高橋  3W
[5]  A1  部長  0001 高橋  4W
[6]  A1  部長  0001 高橋  5W
[7]  A1  部長  0001 高橋  6W
[8]
[9]
[10]
最初のデータ行の tscodeは「A001」です。これが、[F]列〜[L]列の第何列目にあるか
調べ、変数m に代入します。
  m =Application.Match("A001",[F1:L1],1)
m = 1 ですから、F列に(つまり[F2:F7]に 【Sheet】の値を加算していきます。

  [A]  [B]  [C]  [D]  [E]  [F] [G] [H] [I] [J] [K] ・・・
[1] code 役職  社員No 名前 Week A001 B001 D001 E001 F001 G001 H001
[2]  A1  部長  0001 高橋  1W   1
[3]  A1  部長  0001 高橋  2W   0
[4]  A1  部長  0001 高橋  3W   1
[5]  A1  部長  0001 高橋  4W   2
[6]  A1  部長  0001 高橋  5W   0
[7]  A1  部長  0001 高橋  6W   2
[8]

2つめのデータは 前と同じく
> 0001 高橋  A001  2 2 3 2 1 3
なので    m = 1の行に ↑の値を加算していきます。

  [A]  [B]  [C]  [D]  [E]  [F] [G] [H] [I] [J] [K] ・・・
[1] code 役職  社員No 名前 Week A001 B001 D001 E001 F001 G001 H001
[2]  A1  部長  0001 高橋  1W   3
[3]  A1  部長  0001 高橋  2W   2
[4]  A1  部長  0001 高橋  3W   4
[5]  A1  部長  0001 高橋  4W   4
[6]  A1  部長  0001 高橋  5W   1
[7]  A1  部長  0001 高橋  6W   5

以上の処理を最終データ行目で繰り返すことにより、
出力表が出来上がります。

上の処理はセルに直接書き込んでいましたが、これを
配列を用意してそこに出力して、さいごにまとめてシートに吐き出す
ようにすれば処理速度は格段にアップします。

【68170】Re:VBAソースコードについて
お礼  VBA初心者  - 11/2/8(火) 15:48 -

引用なし
パスワード
   kanabun さん

昨日別件の仕事で職場を離れてしまいましたので、
返事ができませんでした。申し訳ありません。
ご丁寧に回答していただき、本当にありがとうございます。
とても参考になりました。


▼kanabun さん:
>▼VBA初心者 さん: こんにちは〜
>
>質問者さんからの応答がありませんが、
>しばらく参加できないので、レス入れときます。
>回答ではありません。
>
>要は、今現在 入力表のデータ入れ替え統合を(手作業で)どうやって
>処理しているのか、ってことです。その手順を文章化できれば、それを
>VBAのコードに直していけばいいのです。手作業でも、VBAでも、作業の
>手順は変わらないですから。
>
>
>Step1.
>元のファイルの入力表の[E]列〜[O]列を このBookのSheet1の
>[A1]にCopyし、「社員No」と「tscode」で昇順ソートします。
>【Sheet1】
>  [A]  [B]  [C]  [D]  [E]  [F][G][H][I][J][K]
>[1] code 役職  社員No 名前 tscode 1W 2W 3W 4W 5W 6W
>[2] A1  部長  0001 高橋  A001  1 0 1 2 0 2
>[3] A1  部長  0001 高橋  A001  2 2 3 2 1 3
>[4] A1  部長  0002 吉田  B001  2 0 3 4 1 0
>[5] C1  課長  0004 鈴木  D001  0 3 4 3 1 0
>[6] E1  社員1 0005 渡辺  E001  4 2 4 4 1 2
>[7] E1  社員1 0006 長谷川 F001  0 2 1 4 3 3
>[8] G1  社員2 0007 川本  G001  2 3 4 1 0 2
>[9] G1  社員2 0007 川本  H001  2 0 4 2 3 1
>[10] G1  社員2 0008 安田  H001  4 2 0 2 4 2
>
>Step2.
>あたらしいシートをこのBookに追加し、一行目にタイトルを
>書き込みます。
>【SheetNew】
>[F1],[G1],.. のtscodeは 元の【Sheet1】の[E]列に Unique:=Trueで
>フィルタオプションをかけ、得られた重複のないtscode一覧をソート
>したものを行列入れ替えて[F1]にPasteSpecialすればいいと思います。
> 変数WS1を【Sheet1】とし、
> 変数WS2 を【SheetNew】のこととすると、
> WS1.[E1:E10].AdvancedFilter xlFilterCopy, _
>      CopyToRange:=WS2.[E1], Unique:=True
>で、
>  [A]  [B]  [C]  [D]  [E]  [F][G][H][I][J][K]・・・
>[1] code 役職  社員No 名前 tscode
>[2]               A001
>[3]               B001
>[4]               D001
>[5]               E001
>[6]               F001
>[7]               G001
>[8]               H001
>[9]              
>[10]             
>が得られますから、この範囲を(E列だけを)ソートして
>[F1]にTranspose貼り付けします。
> Dim r As Range
> With WS2
>  Set r = .range("E1",.range("E1").End(xlDown))
>  r.Sort Key1:=.Columns(1),Header:=xlYes
>  r.Copy
>  .range("F1").PasteSpecial xlPasteValues, Transpose:=True
>  Application.CutCopyMode = True
>  r.ClearContents
> End With
>の処理で、
>【SheetNew】
>  [A]  [B]  [C]  [D]  [E]  [F] [G] [H] [I] [J] [K] ・・・
>[1] code 役職  社員No 名前    A001 B001 D001 E001 F001 G001 H001
>
>となりますから、[E1]に"week"を代入して、タイトル行は完成です。
>
>
>Step3.
>【Sheet1】を上から順に処理していきます。
>最初の社員番号は 「001」なので 2行目〜7行目にその社員の[A]列〜[D]列
>をCOPYします。 またE列に 1W〜6W を代入します。
>【SheetNew】
>  [A]  [B]  [C]  [D]  [E]  [F] [G] [H] [I] [J] [K] ・・・
>[1] code 役職  社員No 名前 Week A001 B001 D001 E001 F001 G001 H001
>[2]  A1  部長  0001 高橋  1W
>[3]  A1  部長  0001 高橋  2W
>[4]  A1  部長  0001 高橋  3W
>[5]  A1  部長  0001 高橋  4W
>[6]  A1  部長  0001 高橋  5W
>[7]  A1  部長  0001 高橋  6W
>[8]
>[9]
>[10]
>最初のデータ行の tscodeは「A001」です。これが、[F]列〜[L]列の第何列目にあるか
>調べ、変数m に代入します。
>  m =Application.Match("A001",[F1:L1],1)
>m = 1 ですから、F列に(つまり[F2:F7]に 【Sheet】の値を加算していきます。
>
>  [A]  [B]  [C]  [D]  [E]  [F] [G] [H] [I] [J] [K] ・・・
>[1] code 役職  社員No 名前 Week A001 B001 D001 E001 F001 G001 H001
>[2]  A1  部長  0001 高橋  1W   1
>[3]  A1  部長  0001 高橋  2W   0
>[4]  A1  部長  0001 高橋  3W   1
>[5]  A1  部長  0001 高橋  4W   2
>[6]  A1  部長  0001 高橋  5W   0
>[7]  A1  部長  0001 高橋  6W   2
>[8]
>
>2つめのデータは 前と同じく
>> 0001 高橋  A001  2 2 3 2 1 3
>なので    m = 1の行に ↑の値を加算していきます。
>
>  [A]  [B]  [C]  [D]  [E]  [F] [G] [H] [I] [J] [K] ・・・
>[1] code 役職  社員No 名前 Week A001 B001 D001 E001 F001 G001 H001
>[2]  A1  部長  0001 高橋  1W   3
>[3]  A1  部長  0001 高橋  2W   2
>[4]  A1  部長  0001 高橋  3W   4
>[5]  A1  部長  0001 高橋  4W   4
>[6]  A1  部長  0001 高橋  5W   1
>[7]  A1  部長  0001 高橋  6W   5
>
>以上の処理を最終データ行目で繰り返すことにより、
>出力表が出来上がります。
>
>上の処理はセルに直接書き込んでいましたが、これを
>配列を用意してそこに出力して、さいごにまとめてシートに吐き出す
>ようにすれば処理速度は格段にアップします。

【68179】Re:VBAソースコードについて
発言  kanabun  - 11/2/9(水) 20:12 -

引用なし
パスワード
   ▼VBA初心者 さん:
こんにちは〜


>>要は、今現在 入力表のデータ入れ替え統合を(手作業で)どうやって
>>処理しているのか、ってことです。その手順を文章化できれば、それを
>>VBAのコードに直していけばいいのです。手作業でも、VBAでも、作業の
>>手順は変わらないですから。

VBA上達のコツは、
1. いま実務で必要な処理を例題とする。
2. 手順を日本語でまとめてみる。
3. できるところから自分の手でコードにしてみる。
というようなことです。

1.は実務上でのご質問なので OK ですね。
あとは、2) と 3) です。
挑戦してみませんか?

2412 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free