プロが教えるわが家の防犯対策術!

こんにちは、エクセル365を使っています。

以前に以下のようなコードを教えて頂いたのですが、これは記述したシートの値の上下を反転させるものです。

これを別ブックに書いて(例えばブックA)、ブックBのシート1を動作させるにはどうしたら良いでしょうか?

目的のファイルが大量にあるために、ブックBのほうに全てこのコードを記述するよりもブックAからまとめてコントロールしたいと思います。

詳しい方、よろしくお願いいたします。

***************** 以下 コード *****************

Sub Macro上下反転()
Dim 最終行 As Long
Dim temp As Variant 'セルの内容によってはstring 等でも可能
Dim 上行 As Long
Dim 下行 As Long
Dim 列変数 As Long

最終行 = ActiveSheet.UsedRange.Rows.Count
'最終行の取得の仕方は複数あります。最適なものを使用してください。

For 上行 = 1 To Int(最終行 / 2)
 下行 = 最終行 - 上行 + 1
 For 列変数 = 2 To 8 '対象列をBからHまで順次
  temp = Cells(上行, 列変数).Value '上側セルの値を取得=一端保存
  Cells(上行, 列変数).Value = Cells(下行, 列変数).Value
  Cells(下行, 列変数).Value = temp
 Next 列変数
 Next 上行
End Sub

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

  • うれしい

    'ファイルをオープン
    Workbooks.Open "〇〇.CSV"
    With Workbooks("〇〇").Sheets("〇〇")
    最終行 = .UsedRange.Rows.Count
    For 上行 = 1 To Int(最終行 / 2)
    下行 = 最終行 - 上行 + 1
    For 列変数 = 2 To 8 '対象列をBからHまで順次
    temp = .Cells(上行, 列変数).Value '上側セルの値を取得=一端保存
    .Cells(上行, 列変数).Value = .Cells(下行, 列変数).Value
    .Cells(下行, 列変数).Value = temp
    Next 列変数
    Next 上行
    End With

    'セーブして閉じる
    Workbooks("〇〇").Save
    Workbooks("〇〇").Close

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/03/20 14:40

A 回答 (4件)

こんにちは



>これを別ブックに書いて、ブックBのシート1を動作させるにはどうしたら良いでしょうか?
操作対象となるセル位置をブック、シートを含めて明示した記述にすれば良いです。
(省略すると、デフォルトとして、VBAのあるブックのアクティブシートなどが参照されるようになります)

具体的には、個々の対象(セル範囲など)を示す際に 「MyBook.MyWorksheet.Range」といった形式で明示すれば良いです。(MyBook、MyWorksheet等は特定のシートなどを示すオブジェクトの変数)

一連の処理にいちいちこのような記述をするのが面倒だというような場合は、Withステートメントを用いて省略記述することも可能です。
 With MyBook.MyWorksheet
.Cells(i, j).Value = "hoge"
.Range("A1:C3").Copy
    ~~~
    ~~~
End With

といった具合です。
上記のうち、「.Cells」は「MyBook.MyWorksheet.Cell」の意味として、「.Range」は「MyBook.MyWorksheet.Rane」として解釈されます。

※ Withに関して、詳しくは以下をご参照ください。
https://docs.microsoft.com/ja-jp/office/vba/lang …
    • good
    • 0
この回答へのお礼

お返事が遅くなりすみません。
そして、回答ありがとうございます。

なるほどです、まとめてWithステートメントで処理するって言う意味なんですね?
今回は実際にコードがあるので、直に指定するほうが良かったのですが、勉強になりました。

ありがとうございます。

お礼日時:2020/03/20 14:31

Sub Macro上下反転()


Dim 最終行 As Long
Dim temp As Variant 'セルの内容によってはstring 等でも可能
Dim 上行 As Long
Dim 下行 As Long
Dim 列変数 As Long

With workbooks("ブックB").sheets("シート1")
最終行 = .UsedRange.Rows.Count
'最終行の取得の仕方は複数あります。最適なものを使用してください。


For 上行 = 1 To Int(最終行 / 2)
 下行 = 最終行 - 上行 + 1
 For 列変数 = 2 To 8 '対象列をBからHまで順次
  temp = .Cells(上行, 列変数).Value '上側セルの値を取得=一端保存
  .Cells(上行, 列変数).Value = .Cells(下行, 列変数).Value
  .Cells(下行, 列変数).Value = temp
 Next 列変数
 Next 上行
End With
End Sub

では
この回答への補足あり
    • good
    • 0
この回答へのお礼

返事が遅れましてすみません。
そして、ありがとうございます。

当方のコードをそのまま利用して最短かつ的確な回答を頂き、ありがとうございました。
実際に利用させて頂きます。

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

お礼日時:2020/03/20 14:32

上記コードがメイン処理として、


Cells(上行, 列変数).Valueなどは、ブック、シートを明示する必要がありますね

他のブックを操作するには、対象のブックを開きます。開いたら閉じることも合わせ考えます。
>目的のファイルが大量にあるために
なのなら、フォルダに纏めて一気にと思いますが、取敢えず、1つのブックに対してのサンプルです。

Sub Sample()
  Dim OpenFileName As String, TrgName As String
  Dim Sht As Worksheet
  '開いたブックに対象のシート名シートがあるか確認
  TrgName = "シート1" '対象のシート名

  'ダイアログでファイルをユーザーが選択
  OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")
  If OpenFileName <> "False" Then
    'ブックを開く(With そのブック内で処理)
    With Workbooks.Open(OpenFileName)
      For Each Sht In Worksheets      'すべてのシートの名前を確認あれば
        If Sht.Name = TrgName Then  '対象のシートがあればメイン処理

          ' Sht.Activate
          ' With Sht
          'メイン処理

          Exit For
        End If
      Next
      '保存して閉じる
      .Saved = True
      .Close
      MsgBox ("完了")
    End With
  End If
End Sub

重い処理でないので、、こんな感じでも出来るかな
未検証なので、コードに付いては、不備がある可能性があります。
内容については、確認を必ず行って、理解の上自己責任でお願いします。
    • good
    • 0

わっ、、、なんとなく見に来て自分の回答にびっくり


大変申し訳ないです。
      .Saved = True
      .Close
は、保存した事にして閉じるです。
.Saved = True
.Close
を削除して

.Close SaveChanges:=True

または、
.Save
.Close
などとしてください。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございます。
また、見に来て下さって感謝いたします。

当方はマクロ初心者で、実際にがんがんマクロを覚える必要は無いのですが、少しずつ覚えていって、解らない事を質問していました。

まとめて処理したりするのを調べるのが実用的でないと判断し、補足のようにしてみました。

一応動作していますが、マクリストの皆さんからしたら、それって変だよ、みたいなとこがあるのかなぁ? と思っています(笑)

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

お礼日時:2020/03/20 14:39

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