Excel VBA質問箱 IV

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

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


2025 / 13645 ツリー ←次へ | 前へ→

【70390】エクセルファイルの移動について ピッポ 11/11/12(土) 16:57 質問[未読]
【70391】Re:エクセルファイルの移動について UO3 11/11/12(土) 17:23 発言[未読]
【70393】Re:エクセルファイルの移動について ピッポ 11/11/12(土) 18:18 発言[未読]
【70396】Re:エクセルファイルの移動について UO3 11/11/12(土) 19:56 発言[未読]
【70399】Re:エクセルファイルの移動について ピッポ 11/11/12(土) 20:56 発言[未読]
【70398】Re:エクセルファイルの移動について UO3 11/11/12(土) 20:29 発言[未読]
【70400】Re:エクセルファイルの移動について UO3 11/11/12(土) 23:07 回答[未読]
【70401】Re:エクセルファイルの移動について ピッポ 11/11/13(日) 1:00 お礼[未読]
【70406】Re:エクセルファイルの移動について ピッポ 11/11/13(日) 22:06 発言[未読]
【70407】Re:エクセルファイルの移動について ピッポ 11/11/14(月) 0:35 発言[未読]
【70408】Re:エクセルファイルの移動について UO3 11/11/14(月) 11:18 発言[未読]
【70411】Re:エクセルファイルの移動について ピッポ 11/11/14(月) 13:11 発言[未読]
【70412】Re:エクセルファイルの移動について UO3 11/11/14(月) 16:12 発言[未読]
【70413】Re:エクセルファイルの移動について ピッポ 11/11/15(火) 6:02 発言[未読]
【70409】Re:エクセルファイルの移動について UO3 11/11/14(月) 11:37 発言[未読]
【70410】Re:エクセルファイルの移動について UO3 11/11/14(月) 11:46 発言[未読]
【70417】Re:エクセルファイルの移動について UO3 11/11/15(火) 12:09 回答[未読]
【70432】Re:エクセルファイルの移動について ピッポ 11/11/16(水) 6:42 発言[未読]
【70434】Re:エクセルファイルの移動について UO3 11/11/16(水) 10:13 発言[未読]
【70435】Re:エクセルファイルの移動について UO3 11/11/16(水) 11:19 発言[未読]

【70390】エクセルファイルの移動について
質問  ピッポ  - 11/11/12(土) 16:57 -

引用なし
パスワード
   1:シート2のC列にハイパーリンクで記したアドレスが記載されています。(移動後)
2:シート1のC列にハイパーリンクで記したアドレスが記載されています。(移動前)

シート1のB列にエクセルファイル名を記した文字が記載されています。
エクセルファイル名を記したファイルは、1:のリンク先に入っています。
このファイルを2:のリンク先に移動するというエクセルマクロを作成したい。
条件として、シート1のE列に”1ケ月”と記載してあるものだけ移動する。
 もし、”1年”と記載があれば、移動するか否かのメッセージを表示を
させる。

申し訳ありませんが、どのように記述すれば実現できますでしょうか?
宜しくお願いします。

【70391】Re:エクセルファイルの移動について
発言  UO3  - 11/11/12(土) 17:23 -

引用なし
パスワード
   ▼ピッポ さん:

こんにちは

質問の中にはいくつものポイントがありますね。
このなかの、どこまでできて、どこがわからないというレベルですか?
それとも、全くわあらないのでコードを教えてということですか?

1.シート1のB列からループで、E列に"1ヶ月"と記述されレいる行のブック名を取り出す
2.取り出したブック名がC列のハイパーリンクの規定の中にあるかどうかを判定する
3.それに対応するシート2のハイパーリンク先を取得する。
 (この対応条件が、いまいち不明ですが。同じ行?あるいは、同じブック名をもつリンクを捜す?)
4.フォルダ間でブックの移動を行う。

【70393】Re:エクセルファイルの移動について
発言  ピッポ  - 11/11/12(土) 18:18 -

引用なし
パスワード
   ▼UO3 さん:
>▼ピッポ さん:
>
>こんにちは
>
>質問の中にはいくつものポイントがありますね。
>このなかの、どこまでできて、どこがわからないというレベルですか?
>それとも、全くわあらないのでコードを教えてということですか?
>
>1.シート1のB列からループで、E列に"1ヶ月"と記述されレいる行のブック名を取り出す
>2.取り出したブック名がC列のハイパーリンクの規定の中にあるかどうかを判定する
>3.それに対応するシート2のハイパーリンク先を取得する。
> (この対応条件が、いまいち不明ですが。同じ行?あるいは、同じブック名をもつリンクを捜す?)
>4.フォルダ間でブックの移動を行う。


ご回答ありがとうございます。
表現が曖昧で失礼しました。
下記のコードをベースに作成を試みてみたのですが、
全くわからない為、教えて頂けないでしょうか?


3.について補足します。
シート1(ワークシート)とシート2は同じブック内にあり、
シート2に移動する前のファイル先が記載されています。
シート1に移動する後のファイル先が記載されています。

それと下記コードは移動するファイルを開いた時にセルA500に”済”と
記載してあれば、シート1のI列に"問題なし"もし、なければ
"問題あり”とできるようになっています。
こちらのコードも生かして頂きたいのですが。


Sub 転送()
Application.ScreenUpdating = False

'ファイル移動(transfer)
Dim ObjFs_tr As Object
Dim FldN_tr As String
Dim FldN_tr2 As String
Dim FileN_tr As String
Dim Cnt_tr As Integer
Dim Re_tr As Integer
Dim ans As String
Set ObjFs_tr = CreateObject("Scripting.FileSystemObject")
FldN_tr = "C:\記録\"
FldN_tr2 = "\\Svr\記録\保管\"
ans = "済"


With Range("B7") ' <-- File_Name指定セル
If .Text = vbNullString Then
MsgBox "記録名を確認してください。", vbCritical
Else
FileN_tr = Dir(FldN_tr2 & .Text & "*.xls")

Do Until FileN_tr = vbNullString

Workbooks.Open FldN_tr2 & FileN_tr
Worksheets(1).Select
If Range("A500") = ans Then
ActiveWorkbook.Close
.Offset(0, 7).Value = "問題なし"
If ObjFs_tr.FileExists(FldN_tr2 & FileN_tr) Then
ObjFs_tr.MoveFile FldN_tr2 & FileN_tr, FldN_tr
Cnt_tr = Cnt_tr + 1
End If
Else
ActiveWorkbook.Close
 .Offset(0, 7).Value = "問題有り"
  End If
FileN_tr = Dir()
Loop
End If
End With

MsgBox Cnt_tr & " 個のファイルを「Svr→書庫」に移動しました。", vbInformation
 Set ObjFs_tr = Nothing

【70396】Re:エクセルファイルの移動について
発言  UO3  - 11/11/12(土) 19:56 -

引用なし
パスワード
   ▼ピッポ さん:

>3.について補足します。
>シート1(ワークシート)とシート2は同じブック内にあり、
>シート2に移動する前のファイル先が記載されています。
>シート1に移動する後のファイル先が記載されています。

たとえばシート1の10行目に、BookA.xls(あるいは BookA あるいは BookA.xlsx?)とあり、
これが対象で、シート1ののC列に移動前情報があったとします。
で、この移動後情報はシート2のC列の10行目にあるということですか?
あるいは、シート2のC列の中からBookAへのハイパーリンクが設定されているセルを検索すうんですか?

【70398】Re:エクセルファイルの移動について
発言  UO3  - 11/11/12(土) 20:29 -

引用なし
パスワード
   ▼ピッポ さん:


コードをざくっと読みましたが、質問で説明されていることとは全く異なる処理のコードになっています。
もう一度、私のレスで申し上げた処理の流れがピッポさんのやりたいことと合致しているのかどうか
確認してください。

【70399】Re:エクセルファイルの移動について
発言  ピッポ  - 11/11/12(土) 20:56 -

引用なし
パスワード
   ▼UO3 さん:
>▼ピッポ さん:
>
>>3.について補足します。
>>シート1(ワークシート)とシート2は同じブック内にあり、
>>シート2に移動する前のファイル先が記載されています。
>>シート1に移動する後のファイル先が記載されています。
>
>たとえばシート1の10行目に、BookA.xls(あるいは BookA あるいは BookA.xlsx?)とあり、
>これが対象で、シート1ののC列に移動前情報があったとします。
>で、この移動後情報はシート2のC列の10行目にあるということですか?
>あるいは、シート2のC列の中からBookAへのハイパーリンクが設定されているセルを検索すうんですか?


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

前者の方になります。

例えば、シート1の10行目に、bookAとあります。11行目にbookB、12行目にbookC・・・というような形になります。
シート1のC列の10行目にbookA、11行目にbookB、12行目にbookC・・・
の移動後情報があります。
移動前情報は、bookAはシート2のC列10行目、bookBは11行目・・・というふうに
連続的に続きます。
になります。シート2から検索してヒットさせるではないです。

私が記述したコードは無視して頂いて構いません。
このコードをベースに作成できないかと模索しただけです。
お手数おかけして申し訳ないです。

    

【70400】Re:エクセルファイルの移動について
回答  UO3  - 11/11/12(土) 23:07 -

引用なし
パスワード
   ▼ピッポ さん:

要件を誤解しているところがあるかもしれませんが・・・・
シート1、シート2のC列のハイパーリンクは「フォルダ」までの指定との前提です。
(ブックまでの指定であれば、また別のコードになります)

Sub Sample()
  Dim myFso As Object
  Dim sh1 As Worksheet
  Dim sh2 As Worksheet
  Dim c As Range
  Dim ans As String
  Dim check As String
  Dim oFold As String
  Dim nFold As String
  Dim fName As String
  Dim ok As Boolean
  Dim i As Long
  Dim cnt As Long
  
  Set myFso = CreateObject("Scripting.FileSystemObject")
  Set sh1 = Sheets("Sheet1")
  Set sh2 = Sheets("Sheet2")
  ans = "済"
  
  For Each c In sh2.Range("B2", sh2.Range("B" & sh2.Rows.Count).End(xlUp))
  
    ok = False
    i = c.Row
    If c.Offset(, 1).Hyperlinks.Count > 0 Then 'C列にハイパーリンクなければスキップ
      oFold = c.Offset(, 1).Hyperlinks(1).Address
      fName = c.Value & ".xls"
      If myFso.folderExists(oFold) Then
        Workbooks.Open oFold & "\" & fName
        check = Worksheets(1).Range("A500").Value
        ActiveWorkbook.Close savechanges:=False
        If check <> ans Then
          If sh1.Cells(i, "C").Hyperlinks.Count > 0 Then 'C列にはーパーリンクなければスキップ
            nFold = sh1.Cells(i, "C").Hyperlinks(1).Address
            If myFso.folderExists(nFold) Then
              If myFso.fileExists(nFold & "\" & fName) Then myFso.DeleteFile nFold & "\" & fName, Force:=True
              myFso.MoveFile oFold & "\" & fName, nFold & "\" & fName
              ok = True
              cnt = cnt + 1
            End If
          End If
        End If
      End If
    End If
    
    With sh1.Cells(i, "I")
      If ok Then
        .Value = "問題なし"
      Else
        .Value = "問題あり"
      End If
    End With
    
  Next
  
  Set myFso = Nothing
  
  MsgBox cnt & " 個のファイルを「Svr→書庫」に移動しました。", vbInformation

End Sub

【70401】Re:エクセルファイルの移動について
お礼  ピッポ  - 11/11/13(日) 1:00 -

引用なし
パスワード
   動作確認致しました。
理想通りのコードで大変満足しています。
この度は、長時間に渡りご尽力頂きありがとうございました。
まだ、マクロについて未熟の身ですので、今回のコードを検証しながら
理解を深めていきたいと思います。

実は、まだ今回作成して頂いたコードをもとに、いくつかやり残した課題が
あるのですが、まずは自力でやってみたいと思います。

本当にありがとうございました。

【70406】Re:エクセルファイルの移動について
発言  ピッポ  - 11/11/13(日) 22:06 -

引用なし
パスワード
   昨日はお世話になりました。
一つだけ教えて頂きたいのですが、
ファイル名が存在しない、ファイル名が違う場合は、移動しない。かつ
問題ありと表示させたいのですが、教えて頂けませんでしょうか?

""記録名"&"***"&"済"&".xls"だけ移動したい。


Sub 転送()
Dim myFso As Object
  Dim sh1 As Worksheet
  Dim sh2 As Worksheet
  Dim c As Range
  Dim ans As String
  Dim check As String
  Dim oFold As String
  Dim nFold As String
  Dim fName As String
  Dim fName2 As String
  Dim ok As Boolean
  Dim i As Long
  Dim cnt As Long
 
  Set myFso = CreateObject("Scripting.FileSystemObject")
  Set sh1 = Sheets("一覧表(フォーマット)")
  Set sh2 = Sheets("元保管場所")
  ans = "済"
  ans1 = "毎月"
  For Each c In sh2.Range("B7", sh2.Range("B" & sh2.Rows.Count).End(xlUp))
 
    ok = False
    i = c.Row
    If c.Offset(, 1).Hyperlinks.Count > 0 Then 'C列にハイパーリンクなければスキップ
      oFold = c.Offset(, 1).Hyperlinks(1).Address
      fName = c.Value & ".xls"
      fName2 = c.Value & ans & ".xls" 'ファイル名&済.xlsを取得
      If myFso.folderExists(oFold) Then
        'Workbooks.Open oFold & "\" & fName2
        'check = Worksheets(1).Range("A500").Value
        'ActiveWorkbook.Close savechanges:=False
        'If check = ans Then  'If check <> ans Then
          If sh1.Cells(i, "F").Hyperlinks.Count > 0 Then 'F列にハイパーリンクなければスキップ
            nFold = sh1.Cells(i, "F").Hyperlinks(1).Address
            If myFso.folderExists(nFold) Then
            If sh1.Cells(i, "E") = ans1 Then


              If myFso.fileExists(nFold & "\" & fName) Then myFso.DeleteFile nFold & "\" & fName, Force:=True
              myFso.MoveFile oFold & "\" & fName2, nFold & "\" & fName
              ok = True
              cnt = cnt + 1
              End If
            End If
          End If
        'End If
      End If
    End If
     End If
    With sh1.Cells(i, "I")
      If ok Then
        .Value = "問題なし"
      Else
        .Value = "問題あり"
      End If
    End With
  
  Next
 
  Set myFso = Nothing
 
  MsgBox cnt & " 個のファイルを「指定された書庫」に移動しました。", vbInformation

End Sub

【70407】Re:エクセルファイルの移動について
発言  ピッポ  - 11/11/14(月) 0:35 -

引用なし
パスワード
   すいません。少し訂正させてください。

ファイル名は、”記録名”と”済”を含むものを対象として移動すると定義する。
ファイル名が存在しない場合、ファイル名が違う(”記録名”と”済”を含まない)場合は移動しないで
次の行のハイパーリンク先にスルーし、判定は問題ありと表示する。

【70408】Re:エクセルファイルの移動について
発言  UO3  - 11/11/14(月) 11:18 -

引用なし
パスワード
   ▼ピッポ さん:

こんにちは

追加要望の前に、私がアップしたコードの流れはざくっといえば

1.シート2のB列に値がある行のC列をピックアップ
2.そのC列にハイーパーリンクがなければスキップ
3.そのハイパーリンクでさしているフォルダがなければスキップ
  ★この後、本来ならそのフォルダに、B列にあるブックが存在するかどうかを判定して
   存在しなければスキップする処理をいれなきゃいけなかったですけど。
4.そのブックを開く
5.そのブックの最初のシートのA500が"済"だったらスキップ
6.このシート2の行と同じ行のシート1のC列にハイパーリンクがなかったらスキップ
7.そこに同名のブックが存在していれば、それを削除。
8.元フォルダから、そのフォルダに移動
9.これまでの↑の処理で「スキップ」となったものについてはシート1のI列に"問題あり"
  スキップされず、最後まで処理されたものについては"問題なし"と記入。

こんな感じです。

●追加要望の、"ファイル名が存在しない" というのは、元フォルダに存在しないという意味ですね。
 であれば、上で★をつけたように、そもそも、そのチェックをすべきだったのを失念したもの。
 追加は容易です。

●「""記録名"&"***"&"済"&".xls"だけ移動したい。」
 この意味がよくわかりません。シート2のB列にあるファイル名は *** なんですか?
 それに対して、文字列を加えて、記録名***済.xls というファイル名を相手にするということですか?
 アップされたコードを読めば、そのあたりがわかるかもしれませんが、そうではなく、ちゃんと
 言葉で説明いただけますか?

●また、仮に、移動対象ファイル名が記録名***済.xlsだったとして、さらに、その最初のシートの
 A500に"済"があるかどうかも判定材料にするんですか?
 アップされたコードは、よく読んでいないのですが、読み込んだファイルのシート上の"済"のチェックをやめて
 シート1の当該行のE列の "毎月"のチェックをしているようですけどこのように変更するんですか? 
 それならそれで、ちゃんといってもらわなければ誰も気がつきませんよ。

【70409】Re:エクセルファイルの移動について
発言  UO3  - 11/11/14(月) 11:37 -

引用なし
パスワード
   ▼ピッポ さん:

もう1つ。
シート2のB列にあるファイルは、それぞれフォルダが異なる可能性がある?
また、シート1のC列のハイパーリンク先は、それぞれ異なるフォルダ?

であれば提示仕様はうなずけるけど、もし、移動前フォルダ、移動後フォルダが
それぞれ1つであれば、仮に、そのフォルダをハイパーリンクで指定するにしても
行ごとの指定は不要で、どこかに1つだけ、移動前フォルダ、1つだけ移動後フォルダを
ハイパーリンクでセットしておけばすみますね?

【70410】Re:エクセルファイルの移動について
発言  UO3  - 11/11/14(月) 11:46 -

引用なし
パスワード
   ▼ピッポ さん:

さらにもう1つ。

シート2のB列にあるファイル名と、実際のフォルダにあるはずのファイル名、
さらに、それを移動したときの移動先フォルダでのファイル名。
(移動ということは、元フォルダから削除するけど、いいですね?)

もし「移動」じゃなく「コピー」なら、移動前のフォルダのファイル名は、そのままなのか
あるいは、「何か別の名前」にリネームするのか?

そのあたりも整理して、説明してくださいね。

【70411】Re:エクセルファイルの移動について
発言  ピッポ  - 11/11/14(月) 13:11 -

引用なし
パスワード
   UO3様

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


表現が曖昧で大変失礼しました。
A500に"済"があるかどうかも判定材料することはやめました。
理由は私の確認不足だったのですが、ファイル名には、シート2のB列の値に
一致しないものも存在しました。

そこで「"記録名"&"***"&"済"&".xls"だけ移動したい。」
と考えました。

"***"はその他の文字列を意味しています。
シート2のB列にある値以外にランダムの文字列(ここでは"
***"と表現しました。)が存在します。
("***"は"シート2のB列の値の前に存在する可能性もあります。)

”済”の文字列の意味は
「シート2のB列に値がある”とファイル名自体に”済”が入っているもの
だけを含んだものだけを移動するというように変更したいという意味に
なります。

また、移動した際に、”済”の文字列だけを削除して
「"シート2のB列にある値"&"***"&".xls"」の形にしたい。

Filterを使用して、配列から条件に一致するものを取得する
ば実現できるまではわかったのですが、うまくいきませんでした。


>シート1の当該行のE列の "毎月"のチェック

これに関しては、継続します。


ここまでをまとめると、A500に"済"があるかどうかの判定材料はやめる。
”シート2のB列に値がある”とファイル名自体に”済”が入っているもの
だけを含んだものだけを移動して判定材料には”問題なし”、
もし入っていなければ、判定材料には”問題あり”とする。


>もう1つ。
シート2のB列にあるファイルは、それぞれフォルダが異なる可能性がある?
また、シート1のC列のハイパーリンク先は、それぞれ異なるフォルダ?

シート2のB列にあるファイルは、移動前、移動後に
それぞれフォルダが異なる可能性はあります。

全て同一のフォルダ先ではありませんので、現状のままで大丈夫です。


>さらにもう1つ。

シート2のB列にあるファイル名と、実際のフォルダにあるはずのファイル名、
さらに、それを移動したときの移動先フォルダでのファイル名。
(移動ということは、元フォルダから削除するけど、いいですね?)

はい。こちらも問題ありません。


このような表現で伝わりますでしょうか?

【70412】Re:エクセルファイルの移動について
発言  UO3  - 11/11/14(月) 16:12 -

引用なし
パスワード
   ▼ピッポ さん:

まだわからないところがあります。

>"記録名"&"***"&"済"&".xls"

この"記録名"は、本当に"記録名"という固定の文字列ですか?
また *** は 任意の文字列ですか?

たとえばシート2のB列にABC とあった場合、
"記録名ABC済.xls" というのが移動すべきフォルダ内のブック名ですか?

それとも、本当に "記録名●●●済.xls" ここで●●●は、何かわからないけど
任意の文字列? すると、ABCの意味は?意味がなくなりますよね。
この場合は、C列のフォルダからワールドカード的に抽出して移動先に移動させるということになりますが?


>「"シート2のB列にある値"&"***"&".xls"」の形にしたい。

こことの関連がわからないのですが、ここは移動先での新しい名前の説明ですね。
ソート2のB列にある値が ABC だと 新しくできるブック名は ABC***.xls ?
それとも、移動前のフォルダにあったブック名の中の ●●● の部分ですか?

1つ、2つの例でいいので、シート2のB列の値、C列の値。その時、移動前フォルダから
なんという名前のブックを抽出するのか?
そして、それを移動先ではなんという名前で保存するのか?
これらを「具体的な名前」で説明いただけませんか?

【70413】Re:エクセルファイルの移動について
発言  ピッポ  - 11/11/15(火) 6:02 -

引用なし
パスワード
   1:>>"記録名"&"***"&"済"&".xls"
>この"記録名"は、本当に"記録名"という固定の文字列ですか?


この”記録名”はシート2のB列にある固定された文字列を
を意味しています。


2:>たとえばシート2のB列にABC とあった場合、
>"記録名ABC済.xls" というのが移動すべきフォルダ内のブック名ですか?
>それとも、本当に "記録名●●●済.xls" ここで●●●は、何かわからないけど
>任意の文字列? すると、ABCの意味は?意味がなくなりますよね。
>この場合は、C列のフォルダからワールドカード的に抽出して移動先に移動させるということになりますよね?


●●●は任意の文字列であり、C列のハイパーリンク先のフォルダにある
エクセルファイル名に含まれています。
シート2のB列には固定された文字列があります。
C列のハイパーリンク先のフォルダ内にあるエクセルファイルは
B列の”固定された文字列”と”●●●”のような任意の文字列と
”済”の文字列で形成されています。
移動対象の条件は、”シート2のB列の固定された文字列”と”済”の文字列の
含んだエクセルファイルだけを移動する。


3:>>「"シート2のB列にある値"&"***"&".xls"」の形にしたい。
>
>こことの関連がわからないのですが、ここは移動先での新しい名前の説明ですね。
>ソート2のB列にある値が ABC だと 新しくできるブック名は ABC***.xls ?
>それとも、移動前のフォルダにあったブック名の中の ●●● の部分ですか?
>
>1つ、2つの例でいいので、シート2のB列の値、C列の値。その時、移動前フォルダから
>なんという名前のブックを抽出するのか?
>そして、それを移動先ではなんという名前で保存するのか?
>これらを「具体的な名前」で説明いただけませんか?


移動する前のファイル名は、
”シート2のB列の”固定された文字列”と
”●●●”のような任意の文字列と”済”の文字列で形成されています。
移動先のファイル名は、”シート2のB列の”固定された文字列”と
”●●●”のような任意の文字列のエクセルファイルにしたい。
つまり、”済”の文字列だけを外したい。


「具体的な名前」を例として挙げさせてもらいます。
例1:シート2のセルB7の値「AAA」、C7の値「C:\sa\dd」
移動前のフォルダには「AAA●●●済」、「BBB●●●」、「AAA●●●」
の3つのエクセルファイルが存在します。
この中で移動対象のファイルは、「AAA●●●済」だけになります。
また、移動した際のファイル名は、「AAA●●●」になります。

例2:シート2のセルB15の値「CCCC」、C15の値「C:\so\jj」
移動前のフォルダには「CCCC●●●」、「●●●CCCC済」、「BBBB●●●」
の3つのエクセルファイルが存在します。
この中で移動対象のファイルは、「●●●CCCC済」だけになります。
また、移動した際のファイル名は、「●●●CCCC」になります。


このような表現でいかがでしょうか?

【70417】Re:エクセルファイルの移動について
回答  UO3  - 11/11/15(火) 12:09 -

引用なし
パスワード
   ▼ピッポ さん:

要件に合っているかどうか、試してみてください。

Sub Sample2()
  Dim myFso As Object
  Dim sh1 As Worksheet
  Dim sh2 As Worksheet
  Dim c As Range
  Dim ans As String
  Dim oFold As String
  Dim nFold As String
  Dim fName As String
  Dim tName As String
  Dim i As Long
  Dim cnt As Long
  
  Dim myPrefix As String
  Dim mySuffix As String
  Dim myCheck As String
  Dim myFile As Object
  
  Dim b As String
  Dim e As String
  mySuffix = "済"
  myCheck = "毎月"
 
  Set myFso = CreateObject("Scripting.FileSystemObject")
  Set sh1 = Sheets("一覧表(フォーマット)")
  Set sh2 = Sheets("元保管場所")
 
  For Each c In sh2.Range("B2", sh2.Range("B" & sh2.Rows.Count).End(xlUp))
 
    myPrefix = c.Value
    i = c.Row
    fName = ""
    '一覧表 E列に 毎月 と記入あるものだけ
    If sh1.Cells(i, "E").Value = myCheck Then
      '元保管場所C列にハイパーリンクあるものだけ
      If c.Offset(, 1).Hyperlinks.Count > 0 Then
        oFold = c.Offset(, 1).Hyperlinks(1).Address
        '一覧表C列にハイパーリンクあるものだけ
        If sh1.Cells(i, "C").Hyperlinks.Count > 0 Then
          nFold = sh1.Cells(i, "C").Hyperlinks(1).Address
          '移動前フォルダ、移動後フォルダが存在するものだけ
          If myFso.folderExists(oFold) And myFso.folderExists(nFold) Then
          
            For Each myFile In myFso.GetFolder(oFold).Files
              e = LCase(myFso.getextensionname(myFile.Name))
              b = myFso.getbasename(myFile.Name)
              'xls のみ
              If e = "xls" Then
                '指定文字列から始まり、"済"でおわっているもののみ
                If b Like myPrefix & "*" & mySuffix Then
                  fName = myFile.Name
                  '移動先ブック名の生成
                  tName = Left(b, Len(b) - Len(mySuffix)) & "." & e
                  Exit For
                End If
              End If
            Next
          
          End If
        End If
      End If
    End If
    
    With sh1.Cells(i, "I")
      '移動前フォルダに指定のブックが存在した場合のみ
      If Len(fName) > 0 Then
        
        If myFso.fileExists(nFold & "\" & tName) Then myFso.DeleteFile nFold & "\" & tName, Force:=True
        myFso.MoveFile oFold & "\" & fName, nFold & "\" & tName
        cnt = cnt + 1
        .Value = "問題なし"
      Else
        .Value = "問題あり"
      End If
    End With
  
  Next
 
  Set myFso = Nothing
  Set sh1 = Nothing
  Set sh2 = Nothing
  
  MsgBox cnt & " 個のファイルを「Svr→書庫」に移動しました。", vbInformation

End Sub

【70432】Re:エクセルファイルの移動について
発言  ピッポ  - 11/11/16(水) 6:42 -

引用なし
パスワード
   ご対応ありがとうございます。

動作確認致しました。

3点程、修正の要望があるのですが、

移動前のフォルダと移動後のフォルダが、共有サーバー内にあるのですが、
それの影響が要因か断定はできないのですが、移動できませんでした。
共有サーバー以外の例えば、Cドライブ内では、正常に動作しました。
共有サーバー内にフォルダがあると、コードに何か反映させるのでしょうか?


シート1の当該行のE列の "毎月"のチェックは実施して、
I列に、”問題なし”と”問題あり”と判断していますが”毎月”以外は
空欄のままにしたいです。


それと動作確認して気付いたのですが、
移動する前のファイル名は、現状
”シート2のB列の”固定された文字列”と
”●●●”のような任意の文字列と”済”の文字列で形成されています。
と、うたいましたが、実際、B列の”固定された文字列”がないものも含まれており対処できなくなりました。
何度も申し訳ないのですが、
移動する前のファイル名に、”済”の文字列のみあれば移動する
と修正をお願いできませんでしょうか?
(シート1のE列の "毎月"のチェックは実施します。)

例:1
シート2のセルB7の値「AAA」、C7の値「C:\sa\dd」
移動前のフォルダには「AAA●●●済」、「BBB●●●済」、「AAA●●●」
の3つのエクセルファイルが存在します。
この中で移動対象のファイルは、「AAA●●●済」と「BBB●●●済」
になります。
移動した際のファイル名は、それぞれ「AAA●●●」と
「BBB●●●」になります。

【70434】Re:エクセルファイルの移動について
発言  UO3  - 11/11/16(水) 10:13 -

引用なし
パスワード
   ▼ピッポ さん:

▼ピッポ さん:

おはようございます

>3点程、修正の要望があるのですが、

最初の課題は別にして、後の2つですが、ピッポさんのVBAのレベルはいかほどでしょう?
全く、右も左もわからないということだと、対応コードを差し上げても、その後、ちょっとした
変更で、また、質問しなきゃいけなくなりますね。特に、欲しい情報を取得する構成として
現在のシート1、シート2の構えが、「これでいいのかなぁ」と、これはコード以前の
設計のレベルの話ですけど、そこがしっかりしていないような印象ですから、やってみて
いずれ、あぁ、そうか、こういう場合もあるから、これはこうだとp、どんどん出てくるような
予感がしています。
最低でも、アップしたコード、できるだけコメントもいれてありますので、どこで何をどのように
処理しているのか、それをしっかり把握いただきたいと思います。そうすれば2番目の課題はご自分で
チューニングできたはずです。


>移動前のフォルダと移動後のフォルダが、共有サーバー内にあるのですが、
>それの影響が要因か断定はできないのですが、移動できませんでした。
>共有サーバー以外の例えば、Cドライブ内では、正常に動作しました。
>共有サーバー内にフォルダがあると、コードに何か反映させるのでしょうか?

う〜ん・・・こちらで移動後、移動前のフォルダをネットワークドライブ(パスは\\から始まります)において
それをハイパーリンクでセットして実行しましたが、Cドライブにあるのと同じように、ネットワークドライブにある
フォルダー間で正常に処理されましたが?
移動できないというのは、何かエラーメッセージがでたのでしょうか?

>
>シート1の当該行のE列の "毎月"のチェックは実施して、
>I列に、”問題なし”と”問題あり”と判断していますが”毎月”以外は
>空欄のままにしたいです。

これが、最初に申し上げたことなんです、

現在のコードは"元保管場所"シートのB列のセルをピックアップし、そのセルごとに

  For Each c In sh2.Range("B2", sh2.Range("B" & sh2.Rows.Count).End(xlUp))
    '
    ' ここでセルごとの処理
    '
  Next

こうなっていますよね。

で、上記をもう少し見ますと

  For Each c In sh2.Range("B2", sh2.Range("B" & sh2.Rows.Count).End(xlUp))
    '
    '一覧表 E列に 毎月 と記入あるものだけ
    If sh1.Cells(i, "E").Value = myCheck Then   '★1
      '
      ' ここで毎月以外のセルごとの処理
      '
    End If                     '★2
    
    With sh1.Cells(i, "I")
      '
      ' ここで処理が「行われたものは」問題なし、「行われなかったものは」問題ありの表記
      '
    End With
  
    '★3 このあたり
  Next

こうなっているでしょ?
★1で条件にあわずに飛ぶのは、★1の「対になった」End If である★2 ですよね。
つまり、E列が毎月であろうがなかろうが、For/Nextで囲まれたブロックの最後で、問題あり、なしの記述が
されてしまうわけで。
ですから、要望の修正を行うとすれば、この「対になった」End If を ★3 このあたり に移せば、
問題あり、なしの記述をしているところをスキップできますよね。


>それと動作確認して気付いたのですが、

上でもいいましたけど、動作確認して気づくというのは、少し表現が「自分に甘い?」
要は、必要な情報を取得するために考えた方法が、その目的にあっていなかったということですよ。

>移動する前のファイル名は、現状
>”シート2のB列の”固定された文字列”と
>”●●●”のような任意の文字列と”済”の文字列で形成されています。
>と、うたいましたが、実際、B列の”固定された文字列”がないものも含まれており対処できなくなりました。
>何度も申し訳ないのですが、
>移動する前のファイル名に、”済”の文字列のみあれば移動する
>と修正をお願いできませんでしょうか?

これを、コードで、はい、はい、こうしましょ というのはたやすいんですけどねぇ・・・
でも!
仮に、シート2のB列が以下のようになっていたとします。
ABC フォルダX
XYZ フォルダX

で、 ABC で処理しましょう。フォルダX で ABC は無視して、とにかく○○○済 のファイルを、
「全て」どこかに移動させたとします。もう、フォルダXの中には○○○済のファイルはありません。
で、次のXYZで処理しますね。もう "XYZ済"も含めて、フォルダの中にはありませんので、からぶりですよね。

さらに、ABC で処理した際に、済がついたファイルがフォルダXに100個あったとします。
提示された条件では、その移動先はシート1の同じ行にあるハイパーリンク先。
でも、100個ですよ。その100個は、XYZ済も含めて全て同じフォルダに持っていっていいのですか?
もしかしたらシート1の XYZ の行にはフォルダZとセットされているかもしれませんよね。

あるいは、100個あったとして、1つずつ、シート1の「どこか(おそらくB列?」を捜して、
その行で処理する?できないことはないですよ。でも、ここで、シート1になかったらどうするとか。

考えなきゃいけないことは、たくさんありそうですよ。
一度、ゆっくりと整理しなおされてはいかがでしょう。

たとえば移動元情報はブック毎の行ではなくフォルダごとの行。
そこで"済"ブックを抽出して、別途のシートにあるブック情報とマッチさせて、その指定の移動先に
もっていく。そこになかったものについては、からぶりとか、あるいは、別シートにアンマッチ情報を
リストアップするとか。

とにかく、ピッポさんが、本当に何をやりたいのか それを整理しなおすことをお勧めします。

【70435】Re:エクセルファイルの移動について
発言  UO3  - 11/11/16(水) 11:19 -

引用なし
パスワード
   ▼ピッポ さん:

追伸です。
整理する際には、いったんコードを忘れて、
たとえばキャビネットにいろんな書類がある。
これを、整理して、あるものは、別のキャビネットに移動させたい。
移動後の書類の背表紙は、新しい書類名で書き換えたい。

この作業を、バイト君に指示するとします。
バイト君は、ピッポさんの業務の内容とか手順とか、ルールとか
何もわからないですよね。
バイト君に、「紙に指示事項を書いて渡す」
その「紙にかかれたことだけ」を読むと、間違いなく作業ができる
そのような指示にしなきゃいけませんね。
じゃないと、しゅっちゅう、「あのぉ、このケースはどうするんでしょうか?」
とバイト君から質問の嵐。

このような「それを読めば誰でも間違いなく作業ができる」メモを作ってみてください。

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