• 締切済み

セルの値の入れ替え(Excel)

エクセルで、各々単一のセル(一つだけのセル範囲)の値を単純に入れ替えるマクロを組んで見ました。これを複数列数と複数列数を入れ替えるマクロに拡張したいと考えています。 具体的には、 □■■■→■■■□ □□■■■→■■■□□ のように単純に入れ替えたいと考えています。 条件は、 □と■の間には他のセルが含まれない状態でののみチェンジ □と■は、同一のシートで同一の行である場合のみチェンジ 書式などについては一切考えないで単純に値のみチェンジ □と■の間に他のセルが含まれない状態の確認が、スマートに出来ません。お手数をお掛けしますがアドバイスいただけないでしょうか?宜しくお願い致します。 Sub Cell_Chenge() Dim MyTmp As String If Selection.Areas.Count = 2 Then If Selection.Areas.Item(1).Count = 1 And       Selection.Areas.Item(2).Count = 1 Then MyTmp = Selection.Areas.Item(1).Value Selection.Areas.Item(1).Value = Selection.Areas.Item(2).Value Selection.Areas.Item(2).Value = MyTmp Else MsgBox "2つのセル範囲は、各々単一のセルでなければなりません。", vbExclamation, "Cell_Chenge" End If Else MsgBox "この操作は、2つのセルを入れ替えるマクロです。", vbExclamation, "Cell_Chenge" End If End Sub

みんなの回答

noname#52504
noname#52504
回答No.2

いまいちスマートにできませんでしたが、じみ~に処理するならこんな感じでしょうか。 実務で当座必要な場合はともかく、VBAの勉強として考えていらっしゃるなら、 私の書き方は参考にしない方が良いかもしれません(汗 なお、#1さんへの補足の、  >(3)"A1"、"C1"の場合、チェンジ可能(行が同じで、長さが同じ) という条件は、質問文の  >□と■の間には他のセルが含まれない状態でののみチェンジ と矛盾するように思われますが、とりあえず"A1"、"C1"の場合は不可、ということで作っています。 Sub Cell_Chenge2()  Dim myTmp() As Variant    'データ退避用  Dim i As Long         'セル範囲を回すカウンタ  Dim j As Long         '各範囲のセルを回すカウンタ  Dim k As Long         'セル全体を回すカウンタ    With Selection.Areas     '範囲の数をチェック   If .Count <> 2 Then    MsgBox "この操作は、2つのセル範囲を入れ替えるマクロです。", vbExclamation, "Cell_Chenge"    Exit Sub   End If      'それぞれの範囲の行数をチェック   If .Item(1).Rows.Count <> 1 Or .Item(2).Rows.Count <> 1 Then    MsgBox "複数行を同時に入れ替えることはできません。", vbExclamation, "Cell_Chenge"    Exit Sub   End If        '範囲1の右隣のセルと、範囲2の左端セルのアドレスを比較   If .Item(1).Item(1).Offset(0, .Item(1).Count).Address <> .Item(2).Item(1).Address Then    MsgBox "範囲が隣接していません。", vbExclamation, "Cell_Chenge"    Exit Sub   End If      'ココからようやく主処理      'データを並べ替えて退避する   ReDim myTmp(1 To .Item(1).Count + .Item(2).Count)   k = 1   For i = 2 To 1 Step -1    For j = 1 To .Item(i).Count     myTmp(k) = .Item(i).Item(j).Value     k = k + 1    Next j   Next i      '退避したデータを書き出す   For k = 1 To .Item(1).Count + .Item(2).Count    Union(.Item(1), .Item(2)).Item(k).Value = myTmp(k)   Next k     End With   End Sub (Excel2003で動作確認済) ちなみに、主処理の部分ですが、 値だけでなく書式ごと入れ替えても良ければ、2行で済みますし変数も不要です。   '範囲2を切り取って、範囲1の左側に挿入する   .Item(2).Cut   .Item(1).Insert Shift:=xlToRight

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

質問の意味が良くわからない。■□などでなく、実際のありそうな例で書いてください。 1セルの値の、文字列を前後逆順にしたいのですか。 >□と■の間には他のセルが含まれない状態でののみチェンジ □と■は、同一のシートで同一の行である場合のみチェンジ の条件の意味を言い直して見てください。 コードから割り出すのは大変。

cbr4001964
質問者

補足

大変失礼致しました。 A, B, C, D, E 1,T11,T12,T13,T14, 2, ,T22,T23,T24 3,T31,T32,T33,T34,T35 A←列の番号 1←行の番号 ","←セルの区切りを表す Txx←セルの値を表す とします。 (1)一つ目のセルの選択範囲を"A1:B1"とし、二つ目のセルの選択範囲を"C1:D1"とした場合は、一つ目のセルと二つ目のセルの間に選択されていないセルがはさまれていないのでチェンジ可能 (2)"A1:B1"、"C1"の場合、チェンジ可能(一つ目と二つ目のセル範囲の行は同じで長さは違うが連続している) (3)"A1:B1"、"D1"の場合、チェンジ不可(行は同じだが、長さが違うし間に"C1"のセルがある) (3)"A1"、"C1"の場合、チェンジ可能(行が同じで、長さが同じ) (4)"A1:B1"、"C2:D2"の場合チェンジ不可(列が違う) (5)"Sheet1\A1:B1"、"Sheet2\C1:D1"の場合チェンジ不可(シートが違う) このような感じなんですが、気持ちが伝わるでしょうか? 何度もお手数をお掛けして申し訳ありません。 宜しくお願いいたします。

関連するQ&A

  • VBAで、セルの値をつなげて入力したいのですが・・・

    VBAで、セルの値をつなげて入力したいのですが・・・ エクセル2007を使用しています。 Ctrlキーで2つのセルを選択し、最初に選択したセルの値にスラッシュをつけて、 2番目に選択したセルの値をつなげ、再び1番目に選択したセルに代入したいと思っています。 例えば、A1セルに「佐藤」B1セルに「鈴木」と入力されており、 A1を選択し、Ctrlキーを押しながらB1セルを選択し、コマンドボタンを押すと A1セルに「佐藤 / 鈴木」と入力させたいと思っています。 選択するセルは、1番目も2番目も、変化します。 そこで、下記のようなマクロを書いてみたのですが、 「実行時エラー13 型が一致しません」というエラーが出ます。 Private Sub CommandButton7_Click() If Selection.Areas.Count <> 2 Then Exit Sub Dim a As Variant Dim b As Variant a = Selection.Areas(1) b = Selection.Areas(2) Selection.Areas(1) = a & "/" & b End Sub 変数の型が問題なのでしょうか? ちなみに Selection.Areas(1) = b とすると、2番目に選択した「鈴木」がA1に入力されます。 また、 Selection.Areas(1) = a & b としても同じエラーが出ます。 解決法があるなら、ご教授いただけませんでしょうか? よろしくお願いいたします。

  • エクセルマクロ セル内の値の抜き出しと入力の値との

    すみません、ハマっております。 下記マクロにて、A2セル内にある(例)「111-22222-5555-666-1」の中のと入力した5555とのマッチングのマクロを作っているのですが、どうしてもA2値がemptyになってしまいうまくマッチングできません。どうしたらよいでしょうか?お力お貸しください。 Private Sub CommandButton1_Click() Unload 番号入力 Dim OdrNum As String If TextBox1.Value = "" Then Exit Sub Else OdrNum = TextBox1.Value While Mid(A2, 11, 4) <> OdrNum '該当番号の欄になるまで不要行削除 If Mid(A2, 11, 4) = "" Then MsgBox "該当番号はありませんでした。" Exit Sub Else End If Rows("2:2").Select Selection.Delete Shift:=xlUp Wend MsgBox "処理終了" End If End Sub

  • エクセルのマクロ

    選択状態にあるセル(どのセルも一文字のみ入力されている)に"●"以外が入力されていたら、全て消去する。 上記を実行するマクロとして以下を試してみましたが、うまくいきません。どこがおかしいのでしょうか? Sub test()  For Each cell In Selection   If Selection.Value <> "●" Then   Selection.ClearContents   End If  Next End Sub

  • エクセル2007 参照セルの値が認識されない

    エクセル2007の環境で下記マクロを実行すると、 アクティブシートのセルA1に数字が入っている場合、Sheet1のセルA1に値を転記しても そのセルA1の値をVLOOKUP関数で参照できません。 マクロに問題があるためなのか何処に問題があるのか分からないので教えてください。 宜しくお願いいたします。 【sheet】は アクティブシートの3行目から1000行目までのA列のセルをクリックしたらセルA1に値を表示 その後、下記【モジュール】を使用し、 アクティブシートのセルA1が空白の場合、 A列の数値をSheet1のセルA1に転記し、アクティブシートのA列の数値が空白になるまで循環する。 Sheet1のセルA1の値をVLOOKUP関数で参照した内容を表示、印刷します。 ----------------------------------------------------------------- '【sheet】 Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target If .Count > 1 + IsEmpty(.Value) Then Exit Sub If Application.Intersect(.Cells, Range("A3:A1000")) Is Nothing Then Exit Sub ActiveSheet.Cells(1, 1).Value = .Value End With End Sub ----------------------------------------------------------------- '【モジュール】 Sub TEST() Dim myBtn As Integer Dim myMsg As String, myTitle As String Dim WS1 As Worksheet, WS2 As Worksheet Dim i As Long myMsg = "●●●" myTitle = "確 認" myBtn = MsgBox(myMsg, vbYesNo + vbExclamation, myTitle) If myBtn = vbYes Then Set WS1 = ActiveSheet Set WS2 = Sheet1 If WS1.Cells(1, 1).Value = "" Then With WS1 For i = 3 To 65536 If .Cells(i, 1).Value = "" Then Exit For WS2.Cells(1, 1).Value = .Cells(i, 1).Value WS2.Cells(1, 2).Value = ActiveSheet.Name 'WS2.PrintOut Copies:=1 Next i End With ElseIf WS1.Cells(1, 1).Value >= 1 Then WS2.Cells(1, 1).Value = WS1.Cells(1, 1).Value WS2.Cells(1, 2).Value = WS1.Name 'WS2.PrintOut Copies:=1 Else End If End If End Sub -----------------------------------------------------------------

  • Excelのセルの比較について

    Excelのマクロにてセルの比較を行っています。 A1に"123" A2をハイパーリンクに指定して"123"と表示しています。 表示形式はどちらも通貨で表示しています。 If Range(A1).Value <> Range(A2).Value Then   MsgBox "同じではない" Else   MsgBox "同じ" End If と比較しているのですが"同じではない"が表示されてしまいます。 試しに MsgBox Range(A1).Value と MsgBox Range(A2).Value を表示してみたところ、どちらも"123"と表示されました。 セルに表示されている値で比較するにはどうしたらいいのでしょうか?

  • 【Excel2010】VBAのFormulaの意味

    エクセル2010を使っている者です。 離れたセルの数字を置き換えられたらなと思ってその方法を探していたら、以下のマクロが見つかりました。 VBAは少しだけかじっているのでFormulaってなんだろうと思って、Formulaを消した状態でマクロを実行してみたのですが、消す前と同様にうまく動きました。 Formulaとはどういったものなのでしょうか?また、この場合、使う意味はあったのでしょうか? Sub swap() Dim w, x As Range, y As Range If Selection.Areas.Count <> 2 Then Exit Sub Set x = Selection.Areas(1) Set y = Selection.Areas(2) w = x.Formula x.Formula = y.Formula y.Formula = w End Sub それと、formulaのことを自分で調べようと思って検索していたら以下の式が見つかりました。 理解できなかったのですが、この場合もFoumulaと書く意味はあるのでしょうか? Range("A1").Formula = "=TODAY()" Range("B1").Formula = "=NOW()" Range("A5").Value = "合計" Range("B5").Formula = "=$B$2+$B$3+$B$4" よろしくお願いいたします。

  • セルの値が0はクリアするマクロ

    エクセル2003です。 ある集計表において 4行目のH列からAM列まで 数値データがあります。 最終行は常に変化します この表内にてセルの値が0のセルは セル内を空白にしたいです。 以下のマクロを作成しましたが If Cells(処理行, 8).Value = 0 Then Cells(処理行, 8).ClearContents をあと(処理行, 13)から(処理行,31) まで記述しなければなりません。 構文的にも処理的にも不利? と思うので、なにかいい方法を教えてください。 Sub 数字0クリア() '2012年2月3日節分 Dim 最終行 '最終列をG列で求めます 最終行 = Cells(Rows.Count, 7).End(xlUp).Row Application.ScreenUpdating = False For 処理行 = 4 To 最終行 If Cells(処理行, 8).Value = 0 Then Cells(処理行, 8).ClearContents End If If Cells(処理行, 9).Value = 0 Then Cells(処理行, 9).ClearContents End If If Cells(処理行, 10).Value = 0 Then Cells(処理行, 10).ClearContents End If If Cells(処理行, 11).Value = 0 Then Cells(処理行, 11).ClearContents End If If Cells(処理行, 12).Value = 0 Then Cells(処理行, 12).ClearContents End If If Cells(処理行, 13).Value = 0 Then Cells(処理行, 13).ClearContents End If Next 処理行 Application.ScreenUpdating = True MsgBox "終了しました" End Sub

  • エクセルのマクロ

    同一列上に連続する複数のセルが選択状態にある時、一番下のセルのデータのみ残して他のセルのデータは消去するマクロとして以下を実行すると、全てのセルのデータが消去されてしまいます。どこを直せばいいでしょうか? Sub test() Dim myRange For Each myRange In Selection.Areas If myRange.Rows.count > 1 Then myRange.Resize(, myRange.Rows.count - 1).ClearContents End If Next End Sub

  • セル解除後、各行に値をコピーし結合するマクロ

    A1からC3のセルが結合しており、 そのセル結合を解除すると、A列のみ値がコピーされる。 コピーした後、各行ごとにセルを結合していく…… という処理をしたいと思い、 調べて下記のマクロまでなんとかこぎつけました。 Sub セル結合() Dim date1 As Variant Dim range1 As Range Application.DisplayAlerts = False For Each range1 In Selection.Rows If range1(1).MergeCells = False Then range1(1).Merge Else date1 = Selection.Rows(1).Value With range1 .UnMerge .WrapText = False .ShrinkToFit = False Selection.Value = date1 End With End If Next range1 End Sub ※実行範囲に関しては、  任意選択をした範囲にしたいため、  range(1)にて処理を行いました。 困っているのは、上記のマクロを実行すると、 最初の行のみ結合できないということ。 もうひとつが、 セル結合をしない時に値を左端にコピーすると、 文字が自動縮小されてしまいます。 縮小しないようにするには、 どのような処理を入れたら良いでしょうか? お力添え頂けますと幸いです。 よろしくおねがいします。

  • 検索後のセルの選択を正しくしたい

    Excel2007でマクロ作成中の初心者です。 以下のコードの中で(1)のところがうまく作動できません。 ここの ActiveCell.Select を正常にするにはどうしたらよいかご教示をお願いします。 Sub 最終日の検索() Dim FC As Range Dim mydate As Date mydate = Range("BQ5").Value For Each FC In Range("BR30:BR300") If FC.Value = DateValue(mydate) Then Exit For End If Next If FC Is Nothing Then MsgBox "みつかりませんここでおわりです" Exit Sub End If MsgBox "見つかりました" & vbLf & FC.Address(0, 0) & vbLf & FC.Value ' ' ここに処理を追加したい ActiveCell.Select ’----------(1) Selection.Offset(0, 45).Select ActiveCell.Select 貼付けしてあるかどうか Set FC = Nothing End Sub ---------------------------------- Sub 貼付けしてあるかどうか() If ActiveCell.Value = "※※" Then MsgBox " 既に貼付けしてあります" Else MsgBox "貼付けしてないので処理します" End If End Sub

専門家に質問してみよう