回答編集履歴

2 syuusei

jawa

jawa score 2966

2017/01/17 09:20  投稿

マクロで作るなら
---
マクロで処理するならSplit関数で配列に格納し、任意の列に出力すれば目的の結果が得られると思います。
※今回はご自身で作成されたコードの提示がないため、具体的なサンプルコードの公開は控えさせていただきますm(__)m
処理手順としては
```
①2行目から対象範囲の最終行までループ処理
(行ループここから)
②ループ処理行のF列から値を取得
③取得した値を"x"で分割(Split関数を利用)
 ⇒配列(0):縦
  配列(1):横
  配列(2):高さ が格納される
④配列0~2の値を列V~Tに出力する
 ⇒Cells(ループ行,"V")=配列(0)
  Cells(ループ行,"U")=配列(1)
  Cells(ループ行,"T")=配列(2)
(行ループここまで)
⑤対象範囲の最終行までループ処理
```
のような流れになると思います。
別案①
---
ちなみに、コピーしたいからExcel関数は避けたい、というのはよくわかります。
関数で簡単に実現できるけど、値で作りたい。でもいちいちマクロを作るのは面倒だ…という場合、関数で目的の結果を作成した後に対象範囲全体を「コピー」⇒同じ範囲に「値の貼り付け」とすることで最終的に値で作成することもできます。
別案②
---
今回の場合、
>「データ」⇒「区切り位置」で分割はできる
とのことですので、これで作成したシートの列を並べ替えるマクロを作成する、という方法もあります。
別案③
---
自分ならどうするかを考えた時、Excelに持ってくる前に加工してしまう方法を取りそうな気がします。
正規表現置換を使えるテキストエディタで事前に加工しておくと、Excelでもできるけど多少面倒なことが意外と簡単にできてしまったりします。
今回の場合、
`^(.+)x(.+)x(.+)$`
`\3\t\2\t\1`
に置き換える正規表現置換を行うと、そのままエクセルに貼り付ける形が用意できます。
ExcelでもVBAでもないアドバイスになってしまいますが、今回のニーズにマッチしそうだったのでご紹介してみました。
参考になれば幸いです。
追記:サンプルコード
サンプル公開を控えたのは丸投げ対策でしたが、marutokiさんからは学習意欲がみられるのでサンプルコードを提供させていただきます。
```
Sub test()
   
   Dim sht As Worksheet   '対象シート
   Set sht = ActiveSheet  '今回はとりあえずアクティブシートを対象シートに設定
   
   Dim iRow As Integer    '行ループ
   Dim iIdx As Integer    '配列から値を取得する
   
   Dim strVal As String   'F列セル値
   Dim aryVal() As String '分割結果
   
   '2行目からF列最終行までループ処理
   For iRow = 2 To sht.Cells(Rows.Count, "F").End(xlUp).Row
       'F列から値を取得
       strVal = sht.Cells(iRow, "F").Value
       
       '取得した値を"x"で分割
        aryVal = Split(strVal, "x")
       
       '縦・横・高さのループ処理(配列の個数だけループ処理)
       For iIdx = 0 To UBound(aryVal)
       For iIdx = 0 To UBound(aryVal) - 1
           
           If iIdx > 2 Then Exit For '3回以上はループしない。(1x2x3x4でも3まで処理)
           
           '1回目:V列(22列)、2回目U列(21列)、3回目T列(20列)に値を出力
           sht.Cells(iRow, 22 - iIdx).Value = aryVal(iIdx)
           
       Next iIdx
       
   Next iRow
   
End Sub
```
1 tuiki

jawa

jawa score 2966

2017/01/16 16:49  投稿

マクロで作るなら
---
マクロで処理するならSplit関数で配列に格納し、任意の列に出力すれば目的の結果が得られると思います。
※今回はご自身で作成されたコードの提示がないため、具体的なサンプルコードの公開は控えさせていただきますm(__)m
処理手順としては
```
①2行目から対象範囲の最終行までループ処理
(行ループここから)
②ループ処理行のF列から値を取得
③取得した値を"x"で分割(Split関数を利用)
 ⇒配列(0):縦
  配列(1):横
  配列(2):高さ が格納される
④配列0~2の値を列V~Tに出力する
 ⇒Cells(ループ行,"V")=配列(0)
  Cells(ループ行,"U")=配列(1)
  Cells(ループ行,"T")=配列(2)
(行ループここまで)
⑤対象範囲の最終行までループ処理
```
のような流れになると思います。
別案①
---
ちなみに、コピーしたいからExcel関数は避けたい、というのはよくわかります。
関数で簡単に実現できるけど、値で作りたい。でもいちいちマクロを作るのは面倒だ…という場合、関数で目的の結果を作成した後に対象範囲全体を「コピー」⇒同じ範囲に「値の貼り付け」とすることで最終的に値で作成することもできます。
別案②
---
今回の場合、
>「データ」⇒「区切り位置」で分割はできる
とのことですので、これで作成したシートの列を並べ替えるマクロを作成する、という方法もあります。
別案③
---
自分ならどうするかを考えた時、Excelに持ってくる前に加工してしまう方法を取りそうな気がします。
正規表現置換を使えるテキストエディタで事前に加工しておくと、Excelでもできるけど多少面倒なことが意外と簡単にできてしまったりします。
今回の場合、
`^(.+)x(.+)x(.+)$`
`\3\t\2\t\1`
に置き換える正規表現置換を行うと、そのままエクセルに貼り付ける形が用意できます。
ExcelでもVBAでもないアドバイスになってしまいますが、今回のニーズにマッチしそうだったのでご紹介してみました。
参考になれば幸いです。
参考になれば幸いです。
追記:サンプルコード
サンプル公開を控えたのは丸投げ対策でしたが、marutokiさんからは学習意欲がみられるのでサンプルコードを提供させていただきます。
```
Sub test()
   
   Dim sht As Worksheet   '対象シート
   Set sht = ActiveSheet  '今回はとりあえずアクティブシートを対象シートに設定
   
   Dim iRow As Integer    '行ループ
   Dim iIdx As Integer    '配列から値を取得する
   
   Dim strVal As String   'F列セル値
   Dim aryVal() As String '分割結果
   
   '2行目からF列最終行までループ処理
   For iRow = 2 To sht.Cells(Rows.Count, "F").End(xlUp).Row
       'F列から値を取得
       strVal = sht.Cells(iRow, "F").Value
       
       '取得した値を"x"で分割
        aryVal = Split(strVal, "x")
       
       '縦・横・高さのループ処理(配列の個数だけループ処理)
       For iIdx = 0 To UBound(aryVal)
           
           If iIdx > 2 Then Exit For '3回以上はループしない。(1x2x3x4でも3まで処理)
           
           '1回目:V列(22列)、2回目U列(21列)、3回目T列(20列)に値を出力
           sht.Cells(iRow, 22 - iIdx).Value = aryVal(iIdx)
           
       Next iIdx
       
   Next iRow
   
End Sub
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る