Excel VBA質問箱 IV

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

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


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

【49621】規定フォームにデータを移したい ロン 07/6/13(水) 17:16 質問[未読]
【49622】Re:規定フォームにデータを移したい ウッシ 07/6/13(水) 17:23 発言[未読]
【49624】Re:規定フォームにデータを移したい ロン 07/6/13(水) 21:19 質問[未読]
【49627】Re:規定フォームにデータを移したい ウッシ 07/6/13(水) 23:18 発言[未読]
【49630】Re:規定フォームにデータを移したい ロン 07/6/14(木) 10:44 質問[未読]
【49632】Re:規定フォームにデータを移したい ウッシ 07/6/14(木) 12:29 発言[未読]
【49637】Re:規定フォームにデータを移したい ロン 07/6/14(木) 13:50 お礼[未読]
【49633】Re:規定フォームにデータを移したい Hirofumi 07/6/14(木) 13:17 回答[未読]

【49621】規定フォームにデータを移したい
質問  ロン  - 07/6/13(水) 17:16 -

引用なし
パスワード
   VBA始めたばかりなのですが、
あるフォームに既存のデータを移したいです。

A列    B列    C列 
機種名  品番   数量
AB00000 11111111  1
AB00000 22222222  2
AB00000 33333333  1
CD11111 44444444  1
CD11111 55555555  2

このようなデータを別のフォームに移す必要があり、
1つの機種名ごとに1シート新規作成が必要です。

フォームはA1からS8まで固定の内容で
まずフォームを新規作成のシートにコピーし
新規シートのB6に機種名を入力し、同じ機種名の品番を
A9から下に、数量をE9から下に記載する必要があります。

またA6には新規で作成したシートの数を順番にシリアルナンバー
のように6桁の数字で記入したいです。

シートはform、data、があり、dataの隣りから新規シートを作成したいです。

このようなシートを6000〜7000個も作成する必要があり
恥ずかしながら投稿させていただきました。
何卒宜しくお願い致します。

【49622】Re:規定フォームにデータを移したい
発言  ウッシ  - 07/6/13(水) 17:23 -

引用なし
パスワード
   こんにちは

処理としては出来ると思いますけど、

>このようなシートを6000〜7000個
本当に「シート」ですか?
それは、止めた方がいいかと思います。

【49624】Re:規定フォームにデータを移したい
質問  ロン  - 07/6/13(水) 21:19 -

引用なし
パスワード
   ▼ウッシ さん:

返信ありがとうございます。
今回の規定フォームへのデータ移行は
あるシステムへのインポートのためなのですが、
新規シートに1つずつデータを作成する方法の他に
1つの新規シートに、フォームの固定の内容A1からS8までをコピーし
品番、数量のデータを記入後、その下にまたフォームの固定内容A1からS8
をコピー、という方法でもインポートできます。

ご指摘いただいたように新規シートに1つずつデータを
作成したのではシートが多くなりすぎるため、
1つの新規シートで全てデータ記入する方法に
変更しようと思います。


A列    B列    C列 
機種名  品番   数量
AB00000 11111111  1
AB00000 22222222  2
AB00000 33333333  1
CD11111 44444444  1
CD11111 55555555  2

このようなデータを別のフォームに移す必要があります。

フォームはA1からS8まで固定の内容で
まずフォームを新規作成のシートにコピーし
新規シートのB6に機種名を入力し、同じ機種名の品番を
A9から下に、数量をE9から下に記載する必要があります。
品番、数量を記入後、フォームからA1からS8までの固定の内容を
コピーし品番、数量の下に貼り付け、機種名が空白になるまで
この処理を続けます。

またA6には新規で作成したシートの数を順番にシリアルナンバー
のように6桁の数字で記入したいです。

シートはform、data、があり、dataの隣りに新規シートを作成したいです。


何卒宜しくお願い致します。

【49627】Re:規定フォームにデータを移したい
発言  ウッシ  - 07/6/13(水) 23:18 -

引用なし
パスワード
   こんばんは

新規シートは1つとして、説明しなおして下さい。

formシート、dataシートの詳細と、マクロ実行後の新規シートの状態をもう少し
データ例を多くして提示して下さい。

全体に説明の文章自体が理解出来ません。

【49630】Re:規定フォームにデータを移したい
質問  ロン  - 07/6/14(木) 10:44 -

引用なし
パスワード
   ▼ウッシ さん:

>新規シートは1つとして、説明しなおして下さい。
>
>formシート、dataシートの詳細と、マクロ実行後の新規シートの状態をもう少し
>データ例を多くして提示して下さい。
>
>全体に説明の文章自体が理解出来ません。

おはようございます。
解りにくい文章で申し訳有りません。
再度極力解りやすく説明させていただきます。

まずシートは「form」、「data」があります。

「data」のとなりに「新規シート」を作成、
「form」のA1からS8までをコピーし、
「新規シート」のA1〜S8に貼り付け、
「data」のA1の機種名、AB00000を
「新規シート」に貼り付けたA1〜S8中の“B6”に記入、(1つの記入でok)
「data」の同じ機種名の同品番B1〜B3を
「新規シート」のA9〜A11に貼り付け
「data」の同じ機種名の数量C1〜C3を
「新規シート」のE9〜E11に貼り付け
1つ目の機種なので“000001”というシリアルNo.を
「新規シート」の“A6”に記入、(2回目以降は“000002〜”)

※「data」内の配置
 A列    B列    C列 
 機種名  品番   数量
1 AB00000 11111111  1
2 AB00000 22222222  2
3 AB00000 33333333  1
4 CD11111 44444444  1
5 CD11111 55555555  2

これで1処理完了。
この後再度「form」のA1からS8までをコピーし、
先程品番、数量を記入した
「新規シート」のA9〜A11、E9〜E11の下にあたる
A12〜S19に「form」のA1からS8までを貼り付け、
上記処理の繰り返しとなります。

お分かりいただけましたでしょうか?
2回目以降「form」のA1〜S8を「新規シート」に貼り付ける位置が
変わってしまうため、機種名、シリアルNo.を入れるセル番地の
特定が難しいと思います。

何卒宜しくお願い致します。

【49632】Re:規定フォームにデータを移したい
発言  ウッシ  - 07/6/14(木) 12:29 -

引用なし
パスワード
   こんにちは

質問と説明通りの条件で動くだけのコードです。

本番データの内容が質問と違っていたので動かないというクレームは無しでお願いします。
質問と違う部分が有ればご自分で修正して下さい。
データが無い場合等のエラー処理はご自分で追加してみて下さい。

Sub test()
  Dim nSh As Worksheet
  Dim aR As Areas
  Dim cR As Range
  Dim a  As Long
  Dim r  As String
  Dim k  As String
  Dim h  As Long
  
  Set nSh = Worksheets.Add(After:=Worksheets("data"))
  Set cR = Worksheets("form").Range("A1:S8")
  Application.ScreenUpdating = False
  With nSh
    .Range("A1:C1").Value = Array("機種名", "品番", "数量")
    Worksheets("data").Range("A1").CurrentRegion.Copy .Range("A2")
    .Range("A1").Subtotal _
      GroupBy:=1, _
      Function:=xlCount, _
      TotalList:=Array(2), _
      Replace:=True, _
      PageBreaks:=False, _
      SummaryBelowData:=True
    With .Range("A1").CurrentRegion
      .Value = .Value
    End With
    .Cells.ClearOutline
    .Range("C1").ClearContents
    .Columns("C:E").Insert Shift:=xlToRight
    Set aR = .Range("A1", .Range("A65536").End(xlUp) _
        .Offset(-1)).Offset(, 5) _
        .SpecialCells(xlCellTypeBlanks).Areas
    With aR
      a = .Count
      For h = a To 2 Step -1
        r = .Item(h - 1).EntireRow.Range("B1").Address
        k = .Item(h - 1).EntireRow.Cells(2, 1).Value
        If h = a Then
          .Item(h).EntireRow.Resize(2).ClearContents
        End If
        .Item(h).EntireRow.Select
        With .Item(h - 1).EntireRow
          nSh.Range(r).EntireRow.Delete
          cR.Copy
          nSh.Range(r).Insert Shift:=xlDown
          nSh.Range(r).Range("A6").NumberFormatLocal = "@"
          nSh.Range(r).Range("A6").Value = Format(h - 1, "000000")
          nSh.Range(r).Range("B6").Value = k
        End With
      Next
    End With
    .Range("A:A").Delete
  End With
  Application.ScreenUpdating = True
  Set nSh = Nothing
  Set aR = Nothing
  Set cR = Nothing
End Sub

【49633】Re:規定フォームにデータを移したい
回答  Hirofumi  - 07/6/14(木) 13:17 -

引用なし
パスワード
   今一、不明な点がありますが?

Option Explicit

Public Sub Sample()

  '◆dataのデータ列数(A列〜C列)
  Const clngColumns As Long = 3
  '◆「機種名」の有る列(A列のA列からの列Offset)
  Const clngGroup As Long = 0
  
  '◆転記先の連番出力列位置を設定
  '(基準位置からの列Offset:A列)
  Const clngNumb As Long = 0
  '◆転記先の「機種名」出力列位置を設定
  '(基準位置からの列Offset:B列)
  Const clngItem As Long = 1
  '◆転記先の「連番」「機種名」出力行位置を設定
  '(基準位置からの行Offset:6行)
  Const clngRow As Long = 5
  
  Dim i As Long
  Dim j As Long
  Dim lngRows As Long
  Dim lngTop As Long
  Dim lngCount As Long
  Dim rngList As Range
  Dim rngResult As Range
  Dim rngHeader As Range
  Dim lngSerial As Long
  Dim lngWrite As Long
  Dim vntGroup As Variant
  Dim vntMark As Variant
  Dim vntPost As Variant
  Dim lngOffset As Long
  Dim strProm As String

  '◆転記元列を転記元基準位置からの列Offsetで指定
  '「品番」B列=1、「数量」C列=2
  vntMark = Array(1, 2)
  '◆転記先列を転記先基準位置からの列Offsetで指定
  '「品番」A列=0、「数量」E列=4
  vntPost = Array(0, 4)
  
  '画面更新を停止
  Application.ScreenUpdating = False
  
  '◆Listの先頭セル位置を基準とする(A列の列見出しのセル位置)
  Set rngList = Worksheets("data").Range("A1")

  '◆formの転記範囲を指定
  Set rngHeader = Worksheets("form").Range("A1:S8")
  'formの行数取得
  lngOffset = rngHeader.Rows.Count
  
  With rngList
    '行数の取得
    lngRows = .Offset(Rows.Count - .Row, clngGroup).End(xlUp).Row - .Row
    If lngRows <= 0 Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    'データをA列で整列
    DataSort .Offset(1).Resize(lngRows, clngColumns), .Offset(, clngGroup)
    'A列データを配列に取得
    vntGroup = .Offset(1, clngGroup).Resize(lngRows + 1).Value
  End With
  
  '転記先の基準位置を設定
  With rngList.Parent.Parent
    Set rngResult = .Worksheets.Add(After:=rngList.Parent).Range("A1")
  End With
  
  '列幅を設定
  With rngHeader
    For i = 1 To .Columns.Count
      rngResult.Offset(, i - 1).EntireColumn.ColumnWidth _
          = .Cells(1, i).EntireColumn.ColumnWidth
    Next i
  End With
  
  '注目値の位置を記録
  lngTop = 1
  'データ行数のカウント初期値
  lngCount = 1
  For i = 2 To lngRows + 1
    '注目値と現在値が違った場合
    If vntGroup(lngTop, 1) <> vntGroup(i, 1) Then
      'Headerを出力
      rngHeader.Copy Destination:=rngResult.Offset(lngWrite)
      '「連番」、「機種名」を出力
      With rngResult
        .Offset(lngWrite + clngRow, clngItem).Value = vntGroup(lngTop, 1)
        With .Offset(lngWrite + clngRow, clngNumb)
          lngSerial = lngSerial + 1
          .NumberFormatLocal = "000000"
          .Value = lngSerial
        End With
        '出力位置を更新
        lngWrite = lngWrite + lngOffset
        '「品番」、「数量」データを転記
        For j = 0 To UBound(vntMark)
          .Offset(lngWrite, vntPost(j)).Resize(lngCount).Value _
              = rngList.Offset(lngTop, vntMark(j)).Resize(lngCount).Value
        Next j
        '出力位置を更新
        lngWrite = lngWrite + lngCount
      End With
      '注目値の位置を記録
      lngTop = i
      'データ行数のカウント初期値に
      lngCount = 1
    Else
      'データ行数のカウントを更新
      lngCount = lngCount + 1
    End If
  Next i

  strProm = "処理が完了しました"
   
Wayout:

  '画面更新を再開
  Application.ScreenUpdating = True
   
  Set rngList = Nothing
  Set rngResult = Nothing
  Set rngHeader = Nothing
   
  MsgBox strProm, vbInformation
     
End Sub

Private Sub DataSort(rngScope As Range, _
          rngKey As Range, _
          Optional lngOrientation As Long = xlTopToBottom)

  rngScope.Sort _
      Key1:=rngKey, Order1:=xlAscending, _
      Header:=xlNo, OrderCustom:=1, MatchCase:=False, _
      Orientation:=lngOrientation, SortMethod:=xlStroke

End Sub

【49637】Re:規定フォームにデータを移したい
お礼  ロン  - 07/6/14(木) 13:50 -

引用なし
パスワード
   ▼ウッシ さん:
 Hirofumiさん

いただいたコードで問題なくデータ移行できました。
本当にありがとうございます。

このコードを研究し、いつか自分でも同様の
問題処理をできるよう勉強していこうと思います。

ありがとうございました。

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