[[20211129224722]] 『VBA 値の貼り付けができないのは・・・』(食いしん坊ママ) >>BOT

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『VBA 値の貼り付けができないのは・・・』(食いしん坊ママ)

フォルダ内のファイルの集計にて、値の貼り付けができない件で
教えて下さい。

フォルダ内のファイルのシートの一部を集計するVBAを作成したのですが、
貼り付け元の値だけを、貼り付け先に持ってきたいのですが、
式まで、張り付いてしまいました。
貼り付け元にはvlookupで商品CDを入れると商品名が表示される表になっていますが、貼り付け先には、表示された値のみ貼り付けたく、
下記の25行目で値の貼り付けになったつもりでしたが、vlookup式が
反映してしまっていました。
何が問題だか解らずご教授お願いしたくよろしくお願いいたします。

Sub 集計()

1 '集計表指定セルより下まで
2 ThisWorkbook.Worksheets("集計").Select
3 Range("A11:x8000").Select
4 Selection.ClearContents
5 Range("Y11").Select

6 '変数の宣言Stringは文字型 エラーの場合無視する
7 Dim myPath As String
8 Dim myFile As String
9 Dim target As Range
10 On Error Resume Next

11 'フォルダ内のファイルのパスを取得
12 myPath = ThisWorkbook.Path & "\"
13 '自動計算停止
14 Application.Calculation = xlCalculationManual
15 Application.ScreenUpdating = False

16 '指定ファイル名が無くなる(myfail="")迄順番に拾う
17 myFile = Dir(myPath & "●●●●*.xls*")
18 Do Until myFile = ""
19 If myFile <> ThisWorkbook.Name Then
20 '1列目の最終行から上に移動したときのセル
    Set target = ThisWorkbook.Worksheets("集計").Cells(Rows.Count, 1).End(xlUp)
22 With Workbooks.Open(Filename:=myPath & "\" & myFile)
23 .Worksheets("記入シート").Range("A12:X211").Copy
24 target.Offset(1, 0)
25 .pastspecial Paste:=xlPasteValues
26 .Close savechanges:=False
27 End With
28 End If
29 myFile = Dir()
30 Loop

31 '集計完了連絡を改行して表示
32 MsgBox "集計が" & Chr(13) & "  完了しました。"

33 End Sub

< 使用 Excel:Office365、使用 OS:unknown >


 24  target.Offset(1, 0).PasteSpecial Paste:=xlPasteValues

 全部見てませんけど、これで行けませんか。
(xxx) 2021/11/29(月) 23:27

(xxx)様
ご返信ありがとうございます
25スペルミスを直してもダメなようです。
(食いしん坊ママ) 2021/11/30(火) 05:46

式のセルをどうしたいのでしょうか。

(1)式を値に変換
(2)式のセルを空欄に。
(3)式のセルを詰める。

ちなみに、.PasteSpecial Paste:=xlPasteValues は(1)になります。

また、式はどの位置にありますか。
特定の列ですか。特定の行ですか。
それも具体的に提示してください。

(hatena) 2021/11/30(火) 08:03


 On Error Resume Next

これを外してどこかでエラーが出るか確認をしてみてください。
(きまぐれおじさん) 2021/11/30(火) 11:45


あと、余計なお世話ですが
 Application.CutCopyMode = False
 Application.Calculation = xlCalculationAutomatic
 Application.ScreenUpdating = True

コードの最後にこれは入れておいた方がいいかもです。
(きまぐれおじさん) 2021/11/30(火) 11:48


 エスパー的回答ですが。

 仮説1) 提示のコードはVBEからのコピペではなく手入力したもの。
        行番号もその際に割り振りした。
 仮説2) 仮説1)を受けて本来下記の箇所は
 .Worksheets(""記入シート"").Range(""A12:X211"").Copy _ '←実際のコードにはアンダーバーあり
 target.Offset(1, 0)
 と推測すると、数式がそのままペーストされた事象に辻褄が合う、気がしますが・・・

 >25スペルミスを直してもダメなようです。
 とあるので、24行目を書き直したわけでなく、25行目のスペルミスのみ修正されたのかも。
(xxx) 2021/11/30(火) 19:16

 >24  target.Offset(1, 0).PasteSpecial Paste:=xlPasteValues

 >全部見てませんけど、これで行けませんか。

 これをスペルミスとだけ表現している↓ところがちょっと・・・。
 実際のコードはどうなっているんですかね?

 >25スペルミスを直してもダメなようです。

 とにかく、上記で説明されている通りに
 まともに書けてないコードのエラーをごまかすための
 エラートラップならぬ、ごまかしエラースキップはやめた方がいいと思いますけど。

 >target.Offset(1, 0) 

 この辺でエラーが出そうな気が?
(疑心) 2021/11/30(火) 20:01

 左側にある数字は、実際にあっても基本的に動作には支障がないんですよね。
 唖然としますよね。
 (今どきの人は知らないだろうが、昔は行番号を書いていた言語もありました。)

 しかし、複数行に継続する _ + space + 改行があるときは、
 これが成立しないのです。エラーになります。

 説明用の工夫なのか、実際に使っているのか知らないですが、
 説明用だけの話なら、行番号のセットはやめたほうがよいと思います。

 なお、
     target.Offset(1, 0)   _
     .pastespecial Paste:=xlPasteValues
 はOKですが、
     target.Offset(1, 0)
     .pastespecial Paste:=xlPasteValues
 はNGです。この違いをよく抑えてください。
 past と paste のスぺルミスだけではありません。    
(γ) 2021/11/30(火) 21:52

 元のコードを最大限活かして手を入れてみました。

 Sub 集計()
     Dim myPath As String
     Dim myFile As String
     Dim target As Range

     '集計表指定セルより下まで
     ThisWorkbook.Worksheets("集計").Range("A11:x8000").ClearContents

     'フォルダ内のファイルのパスを取得
     myPath = ThisWorkbook.Path & "\"

     '自動計算停止
     Application.Calculation = xlCalculationManual
     Application.ScreenUpdating = False

     '指定ファイル名が無くなる(myfail="")迄順番に拾う
     myFile = Dir(myPath & "●●●●*.xls*")
     Do Until myFile = ""
         If myFile <> ThisWorkbook.Name Then
             '1列目の最終行から上に移動したときのセル
             Set target = ThisWorkbook.Worksheets("集計").Cells(Rows.Count, 1).End(xlUp)
             'With Workbooks.Open(Filename:=myPath & "\" & myFile) 'なぜか開くが、下が正しい
             With Workbooks.Open(Filename:=myPath & myFile) 
                 .Worksheets("記入シート").Range("A12:X211").Copy
                 target.Offset(1, 0).PasteSpecial Paste:=xlPasteValues
                 Application.DisplayAlerts = False
                 .Close savechanges:=False
                 Application.DisplayAlerts = True
             End With
         End If
         myFile = Dir()
     Loop
     Application.CutCopyMode = False
     Application.Calculation = xlCalculationAutomatic
     Application.ScreenUpdating = True    
     '集計完了連絡を改行して表示
     MsgBox "集計が" & vbLf & "    完了しました。"
 End Sub
 (Application.DisplayAlerts = Falseを入れたのは、クリップボードに関する警告を抑止するため)

 On Error Resume Next は エラーが発生してもそれを意図的に無視するものなので、
 (特に)デバッグ中は使いません。厳禁です。

 式がコピーされてしまうようには思えなかったですね。

(γ) 2021/12/01(水) 10:16


>(今どきの人は知らないだろうが、昔は行番号を書いていた言語もありました。)
        ↓何数字というのかわからないけど文字化けするので
アップル2の疑似シュミュレートソフトで、そんな風になってました。
Windows95で・・・。
(疑心) 2021/12/01(水) 10:54

ああ、疑心さんのそれは私は知らなかったですね。
私はFortranを念頭に置いたのですが、今も現役の言語でしたね、失礼。
"行番号"については、
https://ja.wikipedia.org/wiki/%E8%A1%8C%E7%95%AA%E5%8F%B7
に、
>FORTRAN や 旧型のBASIC等に見られる。
とあります。
VBAは、昔の機能を盲腸のようにずっと保持しつづけているんですね。
VBAは VB6.0なので不思議でもなんでもないのかな。

(γ) 2021/12/01(水) 11:15


 24  target.Offset(1, 0)
 25 .pastspecial Paste:=xlPasteValues
 じゃなくて、行継続文字を使うなら、行番号は24だけでよいわけで、
 24  target.Offset(1, 0) _ 
     .pastspecial Paste:=xlPasteValues
と書けば行番号があっても動作するわけでした。
まあ、行継続文字を使うほど長くはないですわね。

いずれにせよ、行番号を投稿に使うのはさほど効果はないので避けたほうが無難です。
注意喚起が必要なところには、コメント(' )をつければよいだけです。
それよりも、インデントをきちんとつけるのが先でしょう。

なお、投稿する際、行の一文字目を空白にすると、表記が崩れることが
ありません。これも念頭に置かれるとよいでしょう。

(γ) 2021/12/01(水) 11:30


(γ)様(xxx)様 (きまぐれおじさん)様(疑心)様
返信の時間が空いてしまい申し訳ありません

今日、ようやく見直す事でできて、皆様に頂いた内容を一つ一つ確認しました、

(γ)様の下記の内容で、行頭のドットがどのような場合に必要なのか
を理解し、知識不足を痛感しました。
また、Application.DisplayAlerts = Falseや
On Error Resume Nextの使用方法も教えて頂いておかげでうまく動くようになりました。

 >target.Offset(1, 0)   _
     .pastespecial Paste:=xlPasteValues
 はOKですが、
     target.Offset(1, 0)
     .pastespecial >:=xlPasteValues
 はNGです。この違いをよく抑えてください。

行頭数字は質問用に改行されてしまった場合の為に記載しましたが、
(γ)様に記載いただいた構文のようにしっかりインデントで段落も
つけて書けるように勉強したいと思います

(食いしん坊ママ) 2021/12/04(土) 13:26


コメント返信:

[ 一覧(最新更新順) ]


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