アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のコードで吐き出すときに
列の順番を入れ替えて吐き出すことは可能でしょうか

Dim x
x = Range("A1").CurrentRegion.Value
Range("G1").Resize(UBound(x, 1), UBound(x, 2)) = x

質問者からの補足コメント

  • つらい・・・

    すみません 
     tmp = x(i, n)
     x(i, n) = x(i, m)
     x(i, m) = tmp
    なんとなくは わかりますが、
    n m に何かいれればよいのですか

    No.1の回答に寄せられた補足コメントです。 補足日時:2024/01/17 16:12
  • つらい・・・

    例えばB列とC列を入れ替える
    こんなところなんですが
    わりません
    arr = Array("C", "B")
    For i = LBound(arr) To UBound(arr)
    arr1(i) = Columns(arr1(i)).Column
    Next

    No.2の回答に寄せられた補足コメントです。 補足日時:2024/01/17 20:25
  • うーん・・・

    検索でてて来ましたが、
    配列でやりたのです なんとかなりませんでしょうか
    Worksheets.Add
    ActiveSheet.Next.Activate

    With ActiveSheet
    .Columns(2).Copy .Previous.Range("A1")

    .Columns(4).Copy .Columns(2)
    .Previous.Columns(1).Copy .Columns(4)

    Application.DisplayAlerts = False
    .Previous.Delete
    Application.DisplayAlerts = True
    End With

    No.3の回答に寄せられた補足コメントです。 補足日時:2024/01/17 21:02

A 回答 (4件)

No1です。



>n m に何かいれればよいのですか
回答で説明してあるように、入れ替える対象となる列番号です。
(正しくは、配列の第二添え字のインデックス番号)

他の補足コメントを見ると、なんだか迷走しているようなので、多少一般化したものを作成してみました。
2次元配列だけを対象にします。
使い方は、以下のような感じ。
 x = Range("A1:D6").Value
 f = columnChanger(x, 2, 4)
 If f Then Range("A8:D13").Value = x

関数化してありますが、プロシージャとほぼ同様です。
戻り値は、Booleanで
 TRUE:列の入れ替え処理を完了
 FALSE:引数の不整合などで、無処理のまま
を意味します。
確実に処理できることがわかっている場合は、戻り値は取得しなくてもOKです。
 x = Range("A1:D6").Value
 columnChanger x, 2, 4
 Range("A8:D13").Value = x
みたいな感じ。

第一引数は対象となる配列。第二、第三引数は入替え対象のインデックス番号です。
(A列始まりの配列ならシートの列番号と一致しますが、他のセル範囲の場合はインデックスなので番号はずれます。)


関数本体は以下の通り。
Function columnChanger(ByRef arr, m As Long, n As Long) As Boolean
Dim i As Long, tmp
Dim f As Boolean

' 引数チェック
f = IsArray(arr)
If f Then
On Error Resume Next
While Err.Number = 0
i = i + 1
tmp = UBound(arr, i)
Wend
On Error GoTo 0
If i <> 3 Then f = False
End If

If f Then
If m < LBound(arr, 2) Or UBound(arr, 2) < m Then f = False
If n < LBound(arr, 2) Or UBound(arr, 2) < n Then f = False
End If

columnChanger = f
If Not f Then Exit Function

' 列の入れ替え
For i = LBound(arr, 1) To UBound(arr, 1)
tmp = arr(i, n)
arr(i, n) = arr(i, m)
arr(i, m) = tmp
Next i
End Function
    • good
    • 0
この回答へのお礼

ありがとうございます
早速試してみます。

お礼日時:2024/01/17 22:05

もし一気にしたければ既に出ていますけど、


・B列をZ列(ここは任意且つ使われていない所)にコピペ。
・C列をB列にコピペ。
・Z列をC列にコピペ。
マクロの自動記録でそこそこ作れるのでは?
あとは無駄を削ってみる。
この回答への補足あり
    • good
    • 0

>列の順番を入れ替えて吐き出すことは可能でしょうか



を具体的に記載されてないので回答がわからないのでは?
例:
2列目と4列目を入れ替える。
n:2
m:4
になりますよね?

でも『取得したデータのある列(任意の3列とか?)とある列(同じ)を入れ替える』としたら、また回答も変わるかもです。
単に応用ですけどね。
なのでどの列とどの列をについて、具体的な記載程的確な回答に繋がると思いますよ。
応用が厳しいのであれば。
この回答への補足あり
    • good
    • 0

こんにちは



変数xは基本的に2次元配列になっていますので、
 tmp = x(i, n)
 x(i, n) = x(i, m)
 x(i, m) = tmp
を行数分繰り返せば、n列とm列を入れ替えられます。

ループするのがかったるければ、一旦、出力してしまってから列範囲をまとめて入れ替える方が簡単かも知れません。
こちらなら、まとめて処理できるので、一回の入れ替えで済みます。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A