Excel VBA質問箱 IV

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

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


3227 / 13646 ツリー ←次へ | 前へ→

【63455】列の順番を変える方法 まい 09/11/6(金) 8:43 質問[未読]
【63456】Re:列の順番を変える方法 かみちゃん 09/11/6(金) 8:55 発言[未読]
【63463】Re:列の順番を変える方法 まい 09/11/9(月) 9:39 お礼[未読]
【63457】Re:列の順番を変える方法 SS 09/11/6(金) 9:18 発言[未読]
【63462】Re:列の順番を変える方法 まい 09/11/9(月) 9:38 お礼[未読]
【63458】Re:列の順番を変える方法 Hirofumi 09/11/6(金) 13:40 回答[未読]
【63459】Re:列の順番を変える方法 Hirofumi 09/11/6(金) 13:45 回答[未読]
【63461】Re:列の順番を変える方法 まい 09/11/9(月) 9:36 お礼[未読]
【63466】Re:列の順番を変える方法 Hirofumi 09/11/9(月) 10:47 発言[未読]

【63455】列の順番を変える方法
質問  まい  - 09/11/6(金) 8:43 -

引用なし
パスワード
   シート1にデータが入っています。
そのデータを統一させる為に、列の順番を指定させたいのですが、どうすればよいのか??分かりません。

アドバイスお願いします

統一したい形は下記のような感じです
A列  B列  C列   D列  E列
No   品目  SUB番号  空白列 数量 ←項目の順番

出てくる元データは毎回列の順番が微妙に違っているため、統一させる方法はないでしょうか?

しかも、項目の名前も毎回微妙に違うときがありますので、
例えば,頭文字は同じなので、品目だったら品から始まる項目の列といった考え方がしたいのですが、
何か良いアイデアはないでしょうか

ずっと悩んでいます

よろしくお願いします

【63456】Re:列の順番を変える方法
発言  かみちゃん  - 09/11/6(金) 8:55 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>統一したい形は下記のような感じです
>A列  B列  C列   D列  E列
>No   品目  SUB番号  空白列 数量 ←項目の順番
>
>出てくる元データは毎回列の順番が微妙に違っているため、統一させる方法はないでしょうか?
>
>しかも、項目の名前も毎回微妙に違うときがありますので、
>例えば,頭文字は同じなので、品目だったら品から始まる項目の列といった考え方がしたい

順番は、微妙に違っていても統一するには、フィルタオプションを使えば
できると思うのですが、その前提は、項目名が完全一致していることになります。
そのため、まず、項目名が微妙に違うものを統一する必要があるようですので、
その統一する判断基準を教えてください。
「品目だったら品から始まる項目の列」というのは、人が決めていることで、
「品目」と「品番」があったりするとどうするのですか?

【63457】Re:列の順番を変える方法
発言  SS  - 09/11/6(金) 9:18 -

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

データの形が分からないのでこんな感じとしかいえませんが
 if Left(データ,2)="No" then
   Cells(対象行数,1).Value = データ
 Elseif Left(データ,1)="頭文字" then
   Cells(対象行数,2).Value = データ
 ElseIf Left(データ,3)="SUB" then
   Cells(対象行数,3).Value = データ
 ElseIf ・・・
  ・
  ・
  ・
 End If
但しこれだと何にも考えていないのでもし他のデータの先頭に
同じ文字が使われていると問題が起きますけどその辺は大丈夫でしょうか?

>シート1にデータが入っています。
>そのデータを統一させる為に、列の順番を指定させたいのですが、どうすればよいのか??分かりません。
>
>アドバイスお願いします
>
>統一したい形は下記のような感じです
>A列  B列  C列   D列  E列
>No   品目  SUB番号  空白列 数量 ←項目の順番
>
>出てくる元データは毎回列の順番が微妙に違っているため、統一させる方法はないでしょうか?
>
>しかも、項目の名前も毎回微妙に違うときがありますので、
>例えば,頭文字は同じなので、品目だったら品から始まる項目の列といった考え方がしたいのですが、
>何か良いアイデアはないでしょうか
>
>ずっと悩んでいます
>
>よろしくお願いします

【63458】Re:列の順番を変える方法
回答  Hirofumi  - 09/11/6(金) 13:40 -

引用なし
パスワード
   Option Explicit

Public Sub Sample()

  Dim i As Long
  Dim j As Long
  Dim lngRows As Long
  Dim lngColumns As Long
  Dim lngCount As Long
  Dim rngList As Range
  Dim vntData As Variant
  Dim vntKeys As Variant
  Dim strProm As String

  '項目の頭文字を並べる順番に列挙(空白以外は*を付けて)
  vntKeys = Array("N*", "品*", "S*", "", "数*")

  With ActiveSheet.UsedRange
    If .Columns.Count = 1 Then
      strProm = "データが有りません"
      GoTo Wayout
    End If
    'Listの先頭セル位置を基準とする(先頭列の列見出しのセル位置)
    Set rngList = .Item(1, 1)
    '列数取得
    lngColumns = .Columns.Count
    If lngColumns < UBound(vntKeys) + 1 Then
      lngColumns = UBound(vntKeys) + 1
    End If
    '行数取得
    lngRows = .Rows.Count - 1
  End With
  
  '列見出しを配列に取得
  vntData = rngList.Resize(, lngColumns + 1).Value
  '項目の順位を取得
  For i = 1 To lngColumns
    For j = 0 To UBound(vntKeys)
      If vntData(1, i) Like vntKeys(j) Then
        Exit For
      End If
    Next j
    vntData(1, i) = j
  Next i
    
  '画面更新を停止
  Application.ScreenUpdating = False
  
  With rngList
    'データ最終行の下に順位Keyを出力
    .Offset(lngRows + 1).Resize(, lngColumns).Value = vntData
    '順位順に整列
    DataSort rngList.Resize(lngRows + 2, lngColumns), _
      .Offset(lngRows + 1), xlAscending, xlLeftToRight
    '順位Keyを削除
    .Offset(lngRows + 1).EntireRow.Delete
  End With
    
  strProm = "処理が完了しました"
   
Wayout:

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

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

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

End Sub

【63459】Re:列の順番を変える方法
回答  Hirofumi  - 09/11/6(金) 13:45 -

引用なし
パスワード
   ごめん、コードだけUpしてしまいました

方法は

列見出しを見て、例えば、
 「品目」なら「品」が有るから「1」
 「No」なら「N」が有るから「0」
 「SUB番号」なら「S」が有るから「2」
と列の最終データの後ろに番号を振って、此れをKeyとして列方向の整列を行えば善いかも?

【63461】Re:列の順番を変える方法
お礼  まい  - 09/11/9(月) 9:36 -

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

ありがとうございます・・・

ちょっと試してみます

助かりました

【63462】Re:列の順番を変える方法
お礼  まい  - 09/11/9(月) 9:38 -

引用なし
パスワード
   ▼SS さん:
ありがとうございます
頭文字に同じ文字が存在する可能性もあることが判明しました

もう少し、考え直してみます・・・

アドバイスありがとうございました

【63463】Re:列の順番を変える方法
お礼  まい  - 09/11/9(月) 9:39 -

引用なし
パスワード
   ▼かみちゃん さん:

>「品目だったら品から始まる項目の列」というのは、人が決めていることで、
>「品目」と「品番」があったりするとどうするのですか?

↑上記の件、可能性があることが分かりました。
また、別の方法でよい方法を探してみます

ありがとうございました

【63466】Re:列の順番を変える方法
発言  Hirofumi  - 09/11/9(月) 10:47 -

引用なし
パスワード
     '項目の頭文字を並べる順番に列挙(空白以外は*を付けて)
  vntKeys = Array("N*", "品*", "S*", "", "数*")

は、特に頭文字1文字に限りませんので宜しく
例えば、「品番」が在って「品種」が在るなら

  '項目の頭文字を並べる順番に列挙(空白以外は*を付けて)
  vntKeys = Array("N*", "品種*", "品番*", "S*", "", "数*")

としても善いのですよ

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