Excel VBA質問箱 IV

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

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


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

【70063】貼り付けるデータを一定間隔で分割して貼り付けたい げっち 11/10/13(木) 12:10 質問[未読]
【70064】Re:貼り付けるデータを一定間隔で分割して... UO3 11/10/13(木) 13:48 発言[未読]
【70065】Re:貼り付けるデータを一定間隔で分割して... げっち 11/10/13(木) 15:36 発言[未読]
【70066】Re:貼り付けるデータを一定間隔で分割して... kanabun 11/10/13(木) 16:44 発言[未読]
【70073】Re:貼り付けるデータを一定間隔で分割して... げっち 11/10/13(木) 19:20 発言[未読]
【70074】Re:貼り付けるデータを一定間隔で分割して... kanabun 11/10/13(木) 20:08 発言[未読]
【70081】Re:貼り付けるデータを一定間隔で分割して... げっち 11/10/14(金) 10:20 お礼[未読]
【70067】Re:貼り付けるデータを一定間隔で分割して... UO3 11/10/13(木) 17:19 発言[未読]
【70068】Re:貼り付けるデータを一定間隔で分割して... UO3 11/10/13(木) 17:22 発言[未読]
【70069】Re:貼り付けるデータを一定間隔で分割して... kanabun 11/10/13(木) 17:28 発言[未読]
【70070】Re:貼り付けるデータを一定間隔で分割して... UO3 11/10/13(木) 17:35 発言[未読]
【70072】Re:貼り付けるデータを一定間隔で分割して... kanabun 11/10/13(木) 18:03 発言[未読]

【70063】貼り付けるデータを一定間隔で分割して貼...
質問  げっち  - 11/10/13(木) 12:10 -

引用なし
パスワード
   コピーしたデータを貼り付ける際に、そのデータを途中から区切って
別のところから貼り付けたいと思っております。

具体的に説明しますと
 
|あ|か|さ|た|な|は|

というのをコピーして貼り付ける際に

|あ|か|さ|
 ―  ―  ―
|た|な|は|

というように一定の部分で区切って、途中から次の行に貼り付けをしたいのですが
どのように書けばいいのか分かりません。

どなたかわかる方がおりましたらご教授お願いします。

【70064】Re:貼り付けるデータを一定間隔で分割し...
発言  UO3  - 11/10/13(木) 13:48 -

引用なし
パスワード
   ▼げっち さん:

こんにちは

・2回に分けてコピー/ペーストをする
・一度、どこかにペーストしたあと目的の領域に転記する

なんて回答すると身もふたもない・・・・ですかね?

たとえばの例です。A1〜F1の6セルを A2〜C2 と A3〜C3 にわけて
セットしています。
でも、わざわざ、これをやるぐらいなら、コピー/ペーストではなく
通常のコードで3つずつセルを転記したほうがいいのでは?
★Microsoft Forms 2.0 Object Library への参照設定が必要です。
 ダミーでユーザーフォームを挿入して、その後解放すれば、自動的に参照設定されます。

Sub Sample()
'Microsoft Forms 2.0 Object Libraryに参照設定
  Dim buf As String
  Dim v As Variant
  
  Range("A1:F1").Copy
  
  With New DataObject
    .GetFromClipboard
    buf = .GetText
    v = Split(buf, vbTab)
    Range("A2:C2").Value = extract(v, 1, 3)
    Range("A3:C3").Value = extract(v, 4, 3)
  End With
  
  Application.CutCopyMode = False
  
End Sub

Private Function extract(v As Variant, f As Long, n As Long) As Variant
  Dim i As Long
  Dim k As Long
  Dim w() As String
  
  ReDim w(1 To n)
  
  For i = f - 1 To f - 1 + n - 1
    k = k + 1
    w(k) = WorksheetFunction.Clean(v(i))
  Next
  
  extract = w

End Function

Sub こんなことをするくらいなら()
  Range("A2:C2").Value = Range("A1:C1").Value
  Range("A3:C3").Value = Range("D1:F1").Value
End Sub

【70065】Re:貼り付けるデータを一定間隔で分割し...
発言  げっち  - 11/10/13(木) 15:36 -

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

回答ありがとうございます。

それと説明不足で申し訳ありません。

具体的というのはあくまで簡単な例でして、
実際は1行に100以上ある入力済みのセルをコピーして、
月単位(31日間)で区切って貼り付けたいのです。

【70066】Re:貼り付けるデータを一定間隔で分割し...
発言  kanabun  - 11/10/13(木) 16:44 -

引用なし
パスワード
   ▼げっち さん:こんにちは〜

>実際は1行に100以上ある入力済みのセルをコピーして、
>月単位(31日間)で区切って貼り付けたいのです。

こんな方法はどうでしょう
Sheet1に元表があって、これを Sheet2 に 31列づつCopyします。
そのとき、32列目に 連番を振っておきます。
全列コピーし終わったら、Sheet2全体を(32列目をキーにして)ソート
します。
これで指定の順に並び替えられます。

Sub Try1() 'Sheet1 → Sheet2
  Dim i&, j&
  Dim n&, m&
  Const Stp = 31 '31列づつ
  Dim wk() As Long
  Dim CopyTo As Range
  
  With Sheet2
    .UsedRange.ClearContents
    Set CopyTo = .Cells(1)
  End With
  With Sheet1.UsedRange
    m = .Columns.Count
    n = .Rows.Count
    ReDim wk(1 To n, 1 To 1)
    For i = 1 To n
      wk(i, 1) = i
    Next
    For j = 1 To m Step Stp  'Stp列づつまとめてCopy
      .Columns(j).Resize(, Stp).Copy CopyTo
      CopyTo.Offset(, Stp).Resize(n).Value = wk
      Set CopyTo = CopyTo.Offset(n)
    Next
  End With
  With Sheet2.Cells(1).CurrentRegion
    .Sort Key1:=.Columns(Stp + 1), Header:=xlNo'列見出しなし
    .Columns(Stp + 1).Clear
  End With

End Sub

【70067】Re:貼り付けるデータを一定間隔で分割し...
発言  UO3  - 11/10/13(木) 17:19 -

引用なし
パスワード
   ▼げっち さん:

こんにちは

>実際は1行に100以上ある入力済みのセルをコピーして、
>月単位(31日間)で区切って貼り付けたいのです。

でしょうね。
31列単位に各月のデータが横にずらっとある。
これを縦に配置換えしたいということなんですよね。
(100以上ということですから3〜4ヶ月分ぐらい?)
つまり、レイアウトが決まっているデータを別のレイアウトにするというテーマですから
1.kanabunさんからお答えがあるように配列内で新レイアウトを作成してシートに落とし込む。
2.わたしが、Sub こんなことをするくらいなら() で書いたように、
  転記先領域.Value = 転記元領域.Value
3.・あるいは、冗談めかしてレスしましたが、コピーペーストを繰り返す。

これら、いずれも手作業ではなく、「コードで自動実行」するわけです。
1.が最も効率のよい処理で、2.は効率が悪いので、3.が次善の策でしょうか。

レイアウトですが、1行目からデータですか?それとも1行目はタイトル行でしょうか?

【70068】Re:貼り付けるデータを一定間隔で分割し...
発言  UO3  - 11/10/13(木) 17:22 -

引用なし
パスワード
   ▼げっち さん:

あっ、kanabunさんの回答は3.でしたね。
よく読んでいませんでした。

【70069】Re:貼り付けるデータを一定間隔で分割し...
発言  kanabun  - 11/10/13(木) 17:28 -

引用なし
パスワード
   ▼UO3 さん:
>あっ、kanabunさんの回答は3.でしたね。

でした。
タイミング悪くて スミマセン m(_ _)m

【70070】Re:貼り付けるデータを一定間隔で分割し...
発言  UO3  - 11/10/13(木) 17:35 -

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

>タイミング悪くて スミマセン m(_ _)m

いえいえ。
それより、なぜソートなのかなと疑問に思っていたんですが
今、テストデータを作ってkanabunさんのコードを動かしてみてわかりました。
まず、各月の1行目、次は、各月の2行目・・・・ということですね。

【70072】Re:貼り付けるデータを一定間隔で分割し...
発言  kanabun  - 11/10/13(木) 18:03 -

引用なし
パスワード
   ▼UO3 さん:
>それより、なぜソートなのかなと疑問に思っていたんですが
>今、テストデータを作ってkanabunさんのコードを動かしてみてわかりました。
>まず、各月の1行目、次は、各月の2行目・・・・ということですね。

あぁ、
たとえば

あ い う え お か き く け こ さ し す せ そ
10 11 12 13 14 21 22 23 24 25 31 32 33 34 35

なる2行データがあって、これを【5列づつ】別シートに転記したい、
といったばあい、

あ い う え お
10 11 12 13 14
か き く け こ
21 22 23 24 25
さ し す せ そ
31 32 33 34 35

としたい、ということでしたか?

ぼくはまた、

あ い う え お
か き く け こ
さ し す せ そ
10 11 12 13 14
21 22 23 24 25
31 32 33 34 35

としたいのかな?と。

前者なら、作業列とか Sortは不要ですね。

【70073】Re:貼り付けるデータを一定間隔で分割し...
発言  げっち  - 11/10/13(木) 19:20 -

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

回答ありがとうございます。

>
>こんな方法はどうでしょう
>Sheet1に元表があって、これを Sheet2 に 31列づつCopyします。
>そのとき、32列目に 連番を振っておきます。
>全列コピーし終わったら、Sheet2全体を(32列目をキーにして)ソート
>します。
>これで指定の順に並び替えられます。
>
>Sub Try1() 'Sheet1 → Sheet2
>  Dim i&, j&
>  Dim n&, m&
>  Const Stp = 31 '31列づつ
>  Dim wk() As Long
>  Dim CopyTo As Range
>  
>  With Sheet2
>    .UsedRange.ClearContents
>    Set CopyTo = .Cells(1)
>  End With
>  With Sheet1.UsedRange
>    m = .Columns.Count
>    n = .Rows.Count
>    ReDim wk(1 To n, 1 To 1)
>    For i = 1 To n
>      wk(i, 1) = i
>    Next
>    For j = 1 To m Step Stp  'Stp列づつまとめてCopy
>      .Columns(j).Resize(, Stp).Copy CopyTo
>      CopyTo.Offset(, Stp).Resize(n).Value = wk
>      Set CopyTo = CopyTo.Offset(n)
>    Next
>  End With
>  With Sheet2.Cells(1).CurrentRegion
>    .Sort Key1:=.Columns(Stp + 1), Header:=xlNo'列見出しなし
>    .Columns(Stp + 1).Clear
>  End With
>
>End Sub

上記の方法で行うことができました。ありがとうございます。

ただ、データが1行(横)ではなく、1列(縦)の場合もあるのですが、
その場合はどこがどう変わるのでしょうか。

例えとしては、












これを、

あか
いき
うく
えけ
おこ

こうしたいです。

【70074】Re:貼り付けるデータを一定間隔で分割し...
発言  kanabun  - 11/10/13(木) 20:08 -

引用なし
パスワード
   ▼げっち さん:

>ただ、データが1行(横)ではなく、1列(縦)の場合もあるのですが、
>その場合はどこがどう変わるのでしょうか。

縦1列ですか?

[Sheet1 A列]













これを、

[Sheet2]
A  B  C  
あ か さ
い き し
う く 
え け 
お こ 

> こうしたい
なら、手作業でそれをやるときの手順をコード化していけばいいのでは?
一例ですが、

Sub Try2()
 Dim i As Long, j As Long
 Dim n As Long
 Const Stp = 5   '5行づつ
 With Sheet1
   n = .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).Rows.Count
   For i = 1 To n Step Stp
     j = j + 1
     .Cells(i, 1).Resize(Stp).Copy Sheet2.Cells(1, j)
   Next
 End With
End Sub

【70081】Re:貼り付けるデータを一定間隔で分割し...
お礼  げっち  - 11/10/14(金) 10:20 -

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

回答ありがとうございます。
問題なく動作致しました。ありがとうございました。

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