Excel VBA質問箱 IV

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

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


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

【71493】データの縦から横方向への置き換え ドカ 12/3/12(月) 17:21 質問[未読]
【71495】Re:データの縦から横方向への置き換え UO3 12/3/12(月) 22:32 発言[未読]
【71497】Re:データの縦から横方向への置き換え ドカ 12/3/13(火) 7:48 発言[未読]
【71496】Re:データの縦から横方向への置き換え UO3 12/3/12(月) 22:39 発言[未読]
【71498】Re:データの縦から横方向への置き換え ドカ 12/3/13(火) 7:56 発言[未読]
【71501】Re:データの縦から横方向への置き換え UO3 12/3/13(火) 10:15 回答[未読]
【71502】Re:データの縦から横方向への置き換え UO3 12/3/13(火) 10:19 発言[未読]
【71517】Re:データの縦から横方向への置き換え ドカ 12/3/14(水) 8:06 お礼[未読]
【71499】Re:データの縦から横方向への置き換え ドカ 12/3/13(火) 9:48 お礼[未読]

【71493】データの縦から横方向への置き換え
質問  ドカ  - 12/3/12(月) 17:21 -

引用なし
パスワード
   次のようなデータがあります。
データは月ごとのデータで、縦に並んでいます。
各月のデータの数は決まっていません。
横方向も何列まであるかは分かっていませんが、項目名は書いてあります。


A列    B列    C列 ・・・  ○列
月    項目1   項目2    項目○
1月    x     xx     xxx
1月


2月
3月



12月
12月

これを次のように並べ替えたいのですが、マクロの作成をお願いいたします。
マクロではなくて、エクセルの操作で要領よくやる方法があれば、それでも結構です。

1月                2月               ・・・・・12月
項目1   項目2    項目○  項目1   項目2    項目○       項目1   項目2    項目○
x      xx    xxx

1月や2月といった表示はなくても構いません。
データーが横方向に並んでいれば良いです。

【71495】Re:データの縦から横方向への置き換え
発言  UO3  - 12/3/12(月) 22:32 -

引用なし
パスワード
   ▼ドカ さん:

2007以降であっても、月の種類が12 で 列が 1400弱 あれば、シートにおさまらないけど、そのあたりは大丈夫ということですね?

2003だと月の種類が12なら、列が22あったらオーバーフローですね。

【71496】Re:データの縦から横方向への置き換え
発言  UO3  - 12/3/12(月) 22:39 -

引用なし
パスワード
   ▼ドカ さん:

オートフィルター結果のコピペ、あるいはフィルターオプションでの抜き出しなら手作業でも、あまり苦にはならないと思います。
その操作をマクロ記録すれば、基本的なコードも入手できますので、VBA処理がお望みなら
あとは、それを少しお化粧直しすればいいのでは?

フィルターオプションの場合は、A列から重複を除いた一意の値のリストを抽出すれば
抽出すべき月が取得できますので、それを有効活用することになると思いますね。

【71497】Re:データの縦から横方向への置き換え
発言  ドカ  - 12/3/13(火) 7:48 -

引用なし
パスワード
   ▼UO3 さん: resありがとうございます。

列は3列しかないという条件でよいです。

【71498】Re:データの縦から横方向への置き換え
発言  ドカ  - 12/3/13(火) 7:56 -

引用なし
パスワード
   ▼UO3 さん: resありがとうございます。

このマクロを基本的なマクロとして、今後、色々な場面で活用したいと考えています。

色々な場面というのは、
1月、2月、・・・が、本、野菜、・・・でも使える
列数が3列でも4列でも自動的に判断して、マクロが正しく動く
というようなことです。

ということで、マクロのでは、定型のデータ フォームでないと対応できないので、今回質問してみました。

【71499】Re:データの縦から横方向への置き換え
お礼  ドカ  - 12/3/13(火) 9:48 -

引用なし
パスワード
   ▼UO3 さん: 回答ありがとうございます。

手作業でもそんなに時間もかからずに出来ました。

マクロについては、別途、新規質問を立て、分からないところだけを、質問します。

【71501】Re:データの縦から横方向への置き換え
回答  UO3  - 12/3/13(火) 10:15 -

引用なし
パスワード
   ▼ドカ さん:

>マクロのでは、定型のデータ フォームでないと対応できないので、今回質問してみました。

ですから、私が申し上げた手作業の操作をマクロ記録して、それをお化粧直しすればよろしいかと思いますが
以下、一例です。
Sheet1のデータをSHeet2に転記しています。

Sub sample1()
  Dim x As Long
  Dim w As Long
  Dim j As Long
  Dim sh As Worksheet
  Dim c As Range
  
  Application.ScreenUpdating = False
  
  Set sh = Sheets("Sheet2")  '転記シート
  sh.Cells.ClearContents   '転記シートをクリア
  
  With Sheets("Sheet1")  '元シート
    x = .Cells(1, .Columns.Count).End(xlToLeft).Column '元シートの列数
    w = x + 2                  '作業列開始列番号
    '元シートの作業列に元シートのA列の一意の値を抽出
    .Columns("A:A").AdvancedFilter Action:=xlFilterCopy, _
              CopyToRange:=.Cells(1, w), Unique:=True
    If (x - 1) * (.Cells(1, w).CurrentRegion.Rows.Count - 1) > .Columns.Count Then
      MsgBox "転記するには項目の桁数が多すぎます"
    Else
      .Cells(1, w + 1).Value = .Cells(1, w).Value '抽出用タイトル
      '抽出領域 抽出すべきタイトルをセット
      .Cells(1, w + 3).Resize(, x - 1).Value = .Cells(1, 2).Resize(, x - 1).Value
      '一意の値を順に取り出して、転記シートに転記
      j = 1    '転記シートの転記列。最初は 1。
      For Each c In .Range(.Cells(2, w), .Cells(.Rows.Count, w).End(xlUp))
        .Cells(2, w + 1).Value = c.Value  '抽出条件セット
        'この値に対するデータを抽出
        .Columns("A:D").AdvancedFilter Action:=xlFilterCopy, _
          CriteriaRange:=.Cells(1, w + 1).Resize(2), _
          CopyToRange:=.Cells(1, w + 3).Resize(, x - 1), Unique:=False
        '転記シートに転記
        With .Cells(1, w + 3).CurrentRegion
          sh.Cells(1, j).Value = c.Value
          sh.Cells(2, j).Resize(.Rows.Count, .Columns.Count).Value = .Value
          j = j + .Columns.Count  '次の転記列ポジション
        End With
      Next
    End If
    .Cells(1, w).CurrentRegion.Clear    '作業域クリア
    .Cells(1, w + 3).CurrentRegion.Clear   '作業域クリア
  End With
  
  sh.Select
  Set sh = Nothing
  Application.ScreenUpdating = True
  MsgBox "処理終了しました"
  
End Sub

【71502】Re:データの縦から横方向への置き換え
発言  UO3  - 12/3/13(火) 10:19 -

引用なし
パスワード
   ▼ドカ さん:

レスのアップが入れ違いになったようです。

それは、さておき、アップしたコードのメッセージが適切ではありませんでした。

>      MsgBox "転記するには項目の桁数が多すぎます"

これは


>      MsgBox "転記するには項目の数が多すぎます"

この表現が適切でしたね。

【71517】Re:データの縦から横方向への置き換え
お礼  ドカ  - 12/3/14(水) 8:06 -

引用なし
パスワード
   ▼UO3 さん 回答ありがとうございます。

実際に処理したいデータで試したところ、エラーが出てしまい、対処方法に気づきのに半日掛かってしまいました。

AdvancedFilterの使い方がまったく分かっていなかったので、バージョンの違いで動かないのかなと思い、色々試したところ、まったく別の理由でした。

以下一部修正したので、今後参考にするためにも載せておきます。
(当然U03殿のミスという意味ではありませんので、よろしくお願い致します)

'この値に対するデータを抽出
⇒ここを一部変更  .Range(Columns(1), Columns(x)).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=.Cells(1, w + 1).Resize(2), _
CopyToRange:=.Cells(1, w + 3).Resize(, x - 1), Unique:=False

(独り言)
私の技量では、手作業の操作をマクロ記録して、それをお化粧直しするでは、まったく教えていただいたようなコードは書けません。

繰り返しのコードやデータ領域確保、フィルターのどれをとっても教えて頂いたことを基本として、今後自分のものにしていくレベルです。

また、質問することがあるでしょうが、皆様よろしくご指導ください。

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