[[20200915105440]] 『Book間の値のコピー方法について』(fukushige) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Book間の値のコピー方法について』(fukushige)

 開いた2つのbook間で値をコピーしたいので、.valueを使用して下記のように
 書いたのですが、値を持ってきません。
 どこに問題があるのか、どなたか教えてください。
 行数のgb シートのyd はちゃんと拾ってきています。
 それから、bookは開かなくても値は取得できますでしょうか。
 よろしくお願いします。

 Workbooks.Open Filename:=kaiFname
 strWorkBookName1 = ActiveWorkbook.Name        
 Workbooks.Open Filename:=RFname
 strWorkBookName2 = ActiveWorkbook.Name       
 Workbooks(strWorkBookName1).Activate
  With Sheets("入力")
          .Range("B" & gb) =  Workbooks(strWorkBookName2).Sheets(yd).Range("AB30").Value
          .Range("C" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("Y29").Value

< 使用 Excel:Excel2013、使用 OS:Windows10 >


コードを部分的に貼るのではなく、全部貼ってください。 多くの場合、貼ってくれなかった部分に問題があります。 ご自分で気付かないから、問題個所を避けてコピーしてしまうのでしょう。

とりあえずは、代入に使用している全ての変数が、思った通りの値になっているか、ステップ実行と、変数の中身の確認をしっかり行ってください。

なお、コピー元のブックは開いておかないと駄目です。 開かずに持ってくるには、ExecuteExcel4Macro という古い命令を使えば可能ですが、1セルしか拾えないので、複数個所拾いたい場合は遅いでしょう。
(???) 2020/09/15(火) 13:17


 ご指摘ありがとうございます。
 全文は以下です。まだ途中ですので、ごちゃごちゃしていてすみません。
 関係ない変数など記載があります。
 Sub riyoumeisai()

 Dim td As Variant
 Dim dd As Variant
 Dim yd As Variant
 Dim mypath As Variant
 Dim tepath As Variant
 Dim ripath As Variant
'Dim zenday As Variant
 Dim sg As Variant
 Dim sm As Variant
 Dim sgd As Variant
 Dim strWorkBookName1 As Variant
 Dim strWorkBookName2 As Variant
 Dim strWorkBookName3 As Variant
 Dim strWorkBookName4 As Variant
 Dim kaiFname As String
 Dim RFname As String
 Dim syorit As Variant
 Dim syorim As Variant
 Dim syorigm As Variant
 Dim syorigd As Variant
 Dim nkb As Variant
 Dim hikig As Long    
 Dim yed
 Dim gd
 Dim gb
 Dim gyo As Long
 Dim ned
 Dim nend
 'Dim nennd
 Dim nigetu
 Dim yef

 ned = ThisWorkbook.Worksheets(1).Range("E46").Value
 nend = Format(ned, "ge?N?x")
 nkb = ThisWorkbook.Worksheets(1).Range("E42").Value      
 hikig = nkb - 6                              
 yed = Date - 1                             
 yef = Format(yed, "ge.m")
 gd = CDbl(Date)
 gb = gd - hikig - 1  
 mypath = ThisWorkbook.Path
 ripath = mypath & "\" & "陸\"
 nigetu = "\?@" & nend & "月報\"  
 td = Format(Date, "yyyymmdd")                              
 dd = Format(Date, "d")                                     
 sg = DateSerial(Year(Now), Month(Now), 0)                  
 sm = Format(sg, "m")                                        
 sgd = Format(sg, "d")                                       
 yd = Format(yed, "d")                                                 

 syorit = ThisWorkbook.Worksheets(1).Range("E11").Value       
 syorim = Format(syorit, "ge.m")                             
 syorigm = Format(syorit, "ggge年m月")                       
 syorigd = Format(syorit, "ggge年度")                       
 kaiFname = ripath & "改_報告書(" & nend & ").xlsx"    
 RFname = ripath & nigetu & yef & "月.xlsx"         

 Application.ScreenUpdating = False
 If Dir(kaiFname) = "" Then                               
 MsgBox "改_報告書(" & nend & ").xlsxが" & vbCrLf & "陸フォルダにありません。処理を中止します。", vbExclamation
            Exit Sub
  End If
 If Dir(RFname) = "" Then                               
 MsgBox yef & "月.xlsxが" & vbCrLf & "?@" & nend & "月報フォルダにありません。" & vbCrLf & "処理を中止します。", vbExclamation
    Exit Sub
    End If
 Workbooks.Open Filename:=kaiFname
 strWorkBookName1 = ActiveWorkbook.Name        
 Workbooks.Open Filename:=RFname
 strWorkBookName2 = ActiveWorkbook.Name        
 Workbooks(strWorkBookName1).Activate
   With Sheets("払込み")
          .Range("B" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("AB30").Value
          .Range("C" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("Y29").Value
          .Range("D" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("Z29").Value
          .Range("J" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("AB30").Value
          .Range("K" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("M23").Value
          .Range("L" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("N23").Value
          .Range("O" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("AB30").Value
          .Range("P" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("M26").Value
          .Range("Q" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("N26").Value
          .Range("T" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("AB45").Value
          .Range("U" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("Y44").Value
          .Range("V" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("Z44").Value
          .Range("AB" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("AB30").Value
          .Range("AC" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("K15").Value
          .Range("AD" & gb) = Workbooks(strWorkBookName2).Sheets(yd).Range("L15").Value     

    MsgBox "処理が終了しました。"
        ThisWorkbook.Activate

   End Sub

(fukushige) 2020/09/15(火) 14:50


最後のほうに、With Sheets("払込み") とありますが、対応する End With がないので、このコードは動作しないです。 動作しているけど値が…、とはならないので、これではこちらは全くデバッグできません。

本当にこのコードは動いていますか? マクロ無効で、全く動いていなかったりしませんか? 動いているというのであれば、最初のほうで ned にセル値を代入している行にブレークポイントを設定してから動かしてみてください。 ブレークポイントまで到達したら、F8キーを押す度に1行ずつすすみますから、変数内容を確認しつつ、進めてみてください。

あと、ステップ実行すれば判ると思いますが、RFname というフルパスを作成する際、中に「?」というワイルドカードが混じっています。 ファイル名に使えない文字なので、Workbooks.Open できないはず。 これも、本当に動いているのか信じがたい点です。

どこか別の箇所で、On Error Resume Next とかして、エラー発生をもみ消してはいませんか?
(???) 2020/09/15(火) 15:50


ちょっと確認ですが以下はどのような結果が入れば正解なんですか?
(文字化けしてるんじゃないかとおもって聞いてます)
 nend = Format(ned, "ge?N?x")
 nigetu = "\?@" & nend & "月報\"

(もこな2) 2020/09/15(火) 21:26


ほかにもありました。
 MsgBox yef & "月.xlsxが" & vbCrLf & "?@" & nend 〜

想像するに投稿時に環境依存文字が文字化けしてませんかね

 【例】
 丸付き1・・・・・・・?@
 丸付き2・・・・・・・?A
 丸付き3・・・・・・・?B
 丸付き4・・・・・・・?C
 丸付き5・・・・・・・?D
 カッコ株・・・・・・・??
 ローマ数字の1・・・・?T / ?@
 ローマ数字の2・・・・?U / ?A

(もこな2) 2020/09/15(火) 22:09


なるほど、機種依存文字ですね! 気付きませんでした。

ファイル名に機種依存文字を使うのは、止めた方が良いです。 先日も、サーバ上にLinuxで保存したと思われるファイルがあり、マクロが開けなくて、停止してしまったのを見たことがあります。(Windowsで入力した○1○2なら、ここの掲示板は文字化けするけど、➀➁となっていた)

そうなると、?@ は○1かローマ数字の小文字の1、?N は○15ですか。 ?x は何だろう? 投稿時に表示されるプレビューを見て気づけるだろうから、予め教えて欲しいです。(見直ししていないのだろうなぁ)

? がワイルドカードではないとしても、動かないはずのコードが、動いたのに実行結果が何も変わっていない、というのは変ですから、ステップ実行の結果を知りたいですね。
(???) 2020/09/16(水) 10:04


丸付き数字で文字化けしてるけど気づかずに投稿しちゃうのは、この掲示板ではあるあるネタですよね。

以下、本題。
■1
「関係ない変数など記載があります。」とのことですが、それにしても変数が多いので、ご自身でわけわからなくなりませんか?
1、2回しか使わないようなものであれば、あえて変数に格納しないのも有りではないでしょうか。

■2
変数について、ほぼVariant型になっているわけですが、ゆくゆくは適切な型を指定できるようになるとよいように思います。

■3
また、こだわりがなければインデントを付けるようにすると、コードの構造が把握しやすくなりご自身のデバッグ作業の効率があがるとおもいます。

■4
提示されたコードで(文字化けがあるのが前提として考えて)気になる点があります。

 ripath = mypath & "\" & "陸\"
 nigetu = "\?@" & nend & "月報\"

↑を↓に当てはめると

 RFname = mypath & "\陸\\■" & nend & "月報\" & yef & "月.xlsx"

のようになり、ちょうど文字化けしている文字の前にファイル区切り文字が2個付くことになっています。
私には不自然に思いますが、これは正しいのですか?

■5
とりあえず、整理するとこんな感じになるんじゃないかな〜というものを提示します。
ご自身で整理されているコードと見比べてみてください。
(同じ環境を用意することはできませんから、コンパイルエラーにならないことしか確認してませんが・・)

    Sub 整理()
        Dim 陸フォルダ As String, 月報フォルダ As String
        Dim 日付1 As Date, 日付2 As Date, 日付3 As Date
        Dim Str年度 As String
        Dim 先月末 As Date
        Dim 年度月 As String
        Dim 報告書ファイル As Workbook
        'Dim 月報ファイル As Workbook
        Dim srcSH As Worksheet
        Dim 行 As Long

        With ThisWorkbook.Worksheets(1)
            日付1 = .Range("E46").Value
            日付2 = .Range("E42").Value
            日付3 = .Range("E11").Value
        End With

        Str年度 = Format(日付1, "ge■■")
        陸フォルダ = ThisWorkbook.Path & "\陸\"
        月報フォルダ = "■" & Str年度 & "月報\" '1文字目の[\]は余計 ★でおかしくなる

        先月末 = DateSerial(Year(Now), Month(Now), 0) '使わない
        年度月 = Format(Date - 1, "ge.m月") 'どうせ後ろに月をつけるのだから、この段階でつけちゃう

        If Dir(陸フォルダ & "改_報告書(" & Str年度 & ").xlsx") = "" Then
            MsgBox "改_報告書(" & Str年度 & ").xlsxが" & vbCrLf & "陸フォルダにありません。処理を中止します。", vbExclamation
            Exit Sub
        Else
            Set 報告書ファイル = Workbooks.Open(陸フォルダ & "改_報告書(" & Str年度 & ").xlsx")
        End If

        If Dir(陸フォルダ & 月報フォルダ & 年度月 & ".xlsx") = "" Then    '★修正「月報フォルダの1文字目を取る」
            MsgBox 年度月 & ".xlsxが" & vbCrLf & "■" & Str年度 & "月報フォルダにありません。" & vbCrLf & "処理を中止します。", vbExclamation
            Exit Sub
        Else
            'Set 月報ファイル = Workbooks.Open(陸フォルダ & 月報フォルダ & 年度月 & ".xlsx")
            Set srcSH = Workbooks.Open(陸フォルダ & 月報フォルダ & 年度月 & ".xlsx").Worksheets(Day(Date - 1) & "")
        End If

        行 = CDbl(Date - 日付2 - 6 - 1)

        With 報告書ファイル.Sheets("払込み")
            .Range("B" & 行).Value = srcSH.Range("AB30").Value
            .Range("C" & 行).Value = srcSH.Range("Y29").Value
            .Range("D" & 行).Value = srcSH.Range("Z29").Value
            .Range("J" & 行).Value = srcSH.Range("AB30").Value
            .Range("K" & 行).Value = srcSH.Range("M23").Value
            .Range("L" & 行).Value = srcSH.Range("N23").Value
            .Range("O" & 行).Value = srcSH.Range("AB30").Value
            .Range("P" & 行).Value = srcSH.Range("M26").Value
            .Range("Q" & 行).Value = srcSH.Range("N26").Value
            .Range("T" & 行).Value = srcSH.Range("AB45").Value
            .Range("U" & 行).Value = srcSH.Range("Y44").Value
            .Range("V" & 行).Value = srcSH.Range("Z44").Value
            .Range("AB" & 行).Value = srcSH.Range("AB30").Value
            .Range("AC" & 行).Value = srcSH.Range("K15").Value
            .Range("AD" & 行).Value = srcSH.Range("L15").Value
        End With

        MsgBox "処理が終了しました。"
        ThisWorkbook.Activate
    End Sub

(もこな2) 2020/09/16(水) 11:55


↑の補足
 〜Worksheets(Day(Date - 1) & "")

について、

 yed = Date - 1
 yd = Format(yed, "d")
 〜Sheets(yd)〜

を整理した結果ですが、なんで「& ""」が必要なのか、混乱させるかもしれないので説明しておきます。
単純に言えば、「Day(Date - 1)」で得られるのは、前日の日にちを表す【数値】だからです。
なので、そのままでは15番目のシートを意味することになってしまうため、わざと0文字を結合して文字列に変えています。

 Sheets(15)・・・・・・15番目のシート
 Sheets("15")・・・・・「15」という名前のシート

(もこな2) 2020/09/16(水) 12:10


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.