Excel VBA質問箱 IV

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

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


346 / 3841 ページ ←次へ | 前へ→

【75501】Re:ファイル名をセルから取得
発言  kanabun  - 14/4/23(水) 23:11 -

引用なし
パスワード
   ▼fuyu さん:

>どこがおかしいでしょうか。

>Open "C:\TEST\Pattern1.txt" For Input As #1

>Open "C:\TEST\" & Worksheets("Sheet1").Cells(1,1) & For Input As #1
                         ↑
↑の「&」は余分です。
・ツリー全体表示

【75500】ファイル名をセルから取得
質問  fuyu  - 14/4/23(水) 22:12 -

引用なし
パスワード
   VBA初心者です。

Cドライブ直下に「TEST」というフォルダがあり、
その中にテキストファイルが数個あります。
Pattern1.txt
Pattern2.txt
Pattern3.txt
Pattern4.txt
  :
  :
これらテキストファイル名はエクセルに入力されています。

テキストファイルを読み込む際に
Open "C:\TEST\Pattern1.txt" For Input As #1
だと、うまく読み込めますが、
ファイル名をセルから指定するようにするとうまくいきません。
Open "C:\TEST\" & Worksheets("Sheet1").Cells(1,1) & For Input As #1

どこがおかしいでしょうか。
また、他に良い方法はありますでしょうか。
よろしくお願いします。
・ツリー全体表示

【75498】印刷用マクロについて
質問  t.v  - 14/4/22(火) 16:21 -

引用なし
パスワード
   お世話になります。t.vと申します

自分の前任者が作成したマクロの改修を依頼されまして、改修するマクロは、
【対象フォルダに格納されているexcelファイルを全て印刷する】です。
細かい処理でプリンタ仕様で99ファイルで一旦ストップしたり、印刷するファイル名の書き出し等がありますが、
今回改修したい部分は【excelファイル】→【全ファイル】に改修する予定です。
当方、VBAは勉強中の身で処理内容がほぼ解らず対応方法が解りません。
ファイル拡張子部分を追加したりしたのですがどうにもうまくいきませんでした。
どうかご教授願います。

現在使用してるマクロを以下に記載しますが、全く別のマクロを提示頂いて構いません。
一番の目的は【対象フォルダ内のファイルを全て(txt,excel,word,pdf)印刷する】です。
*----------------------------------------*
Sub 指定ドライブのファイルの一覧を作成する()

Application.ScreenUpdating = False

  Dim xxx As Range
  
  Dim FSO As Object
  Dim fol As Object
  Dim Fil As Object
  Dim FileBuf As Object
  
  Dim Subfol As Object
  Dim SubFil As Object
  Dim SubFolderBuf As Object
  
  Dim count As Integer
  
  Dim PrintFlag As Boolean
  PrintFlag = False
  
  Const c_div_cnt As Integer = 99       '処理分割単位(ファイル数)
  Dim print_cnt As Integer          '印刷済みファイル数カウンタ
  Dim total_print As Integer         '印刷済みファイル総数
  
  Set xxx = Worksheets("Sheet1").Range("b2")

  print_cnt = 0
  total_print = 0

  Worksheets("Sheet1").Activate
  Range("A:A").ClearContents         'クリアする
  
  
  Set FSO = CreateObject("Scripting.FileSystemObject")  'ファイルシステムオブジェクトのインスタンス化
  
On Error Resume Next
  Set fol = FSO.Getfolder(xxx)          'フォルダを取得
  Set Fil = fol.Files               'ファイルを取得

  Set Subfol = Nothing              'サブフォルダを検索
  Set Subfol = FSO.Getfolder(xxx).SubFolders   'サブフォルダを取得
On Error GoTo 0
  
  'もし、ファイルがフォルダ内に見つからない場合、何もしない
  If fol.Files.count = 0 Then
  
  Else
    count = 1
    For Each FileBuf In Fil
      
      If (Right(Dir(FileBuf.Path), 4) = ".xls") Or (Right(Dir(FileBuf.Path), 4) = "xlsx") Or (Right(Dir(FileBuf.Path), 4) = "xlsm") Then
        PrintFlag = True  'ひとつでもxlsファイルが見つかった場合に、PrintFlagをTrueにする
        Cells(count, 1) = FileBuf.Path
        count = count + 1
      End If
    Next
    
  End If
  
  
  'もし、サブフォルダがフォルダ内に見つからない場合、何もしない
  If Subfol Is Nothing Then
  
  Else
    For Each SubFolderBuf In Subfol
    
    Call Loop_LISTUP(SubFolderBuf.Path, count, PrintFlag)
  
    Next
  End If

Application.ScreenUpdating = True
    
    
  If PrintFlag Then
    If vbCancel = MsgBox("全部で" & (count - 1) & "ファイルを印刷します", vbOKCancel) Then
      Exit Sub
    End If
    If c_div_cnt < (count - 1) Then
      MsgBox c_div_cnt & "ファイルを印刷する毎に処理を一旦停止します", vbOKOnly
    End If
      
    For n = 2 To count
      Workbooks.Open Worksheets("Sheet1").Cells(n - 1, 1).Value
      Worksheets(1).PageSetup.LeftHeader = "&F"
      ActiveWorkbook.PrintOut Copies:=1, Collate:=True
      Worksheets(1).Activate
      ActiveWindow.Close False
      
      print_cnt = print_cnt + 1
      If c_div_cnt = print_cnt Then
        '印刷済数カウントアップ
        total_print = total_print + print_cnt
        'カウンタクリア
        print_cnt = 0
        If 0 < (count - 1) - total_print Then
          If vbCancel = MsgBox("残り" & (count - 1) - total_print & "ファイルです。" & Chr(13) & Chr(10) & _
            "プリンタ出力を完了させてからOKを押してください", vbOKCancel) Then
            Exit Sub
          End If
        End If
      End If
    Next
  
  End If
  
Application.ScreenUpdating = True
'  Cells(1, 結果).Clear                  'クリアする
  
End Sub

Private Sub CommandButton1_Click()
Call 指定ドライブのファイルの一覧を作成する
End Sub


Sub Loop_LISTUP(ByVal target As String, ByRef count As Integer, ByRef PF As Boolean)

  Dim FSO As Object
  Dim fol As Object
  Dim Fil As Object
  Dim FileBuf As Object
  
  Dim Subfol As Object
  Dim SubFil As Object
  Dim SubFolderBuf As Object
  
  Worksheets("Sheet1").Activate
  Set FSO = CreateObject("Scripting.FileSystemObject")  'ファイルシステムオブジェクトのインスタンス化

On Error Resume Next
  Set fol = FSO.Getfolder(target)          'フォルダを取得
  Set Fil = fol.Files                 'ファイルを取得
  
  Set Subfol = Nothing
  Set Subfol = FSO.Getfolder(target).SubFolders     'サブフォルダを取得
On Error GoTo 0
  
  'もし、ファイルがフォルダ内に見つからない場合、何もしない
  If fol.Files.count = 0 Then
  
  Else
    For Each FileBuf In Fil
      
      If (Right(Dir(FileBuf.Path), 4) = ".xls") Or (Right(Dir(FileBuf.Path), 4) = "xlsx") Or (Right(Dir(FileBuf.Path), 4) = "xlsm") Then
        PF = True  'ひとつでもxlsファイルが見つかった場合に、PFをTrueにする
        Cells(count, 1) = FileBuf.Path
        count = count + 1
      End If

    Next
  End If
    
  'もし、サブフォルダがフォルダ内に見つからない場合、何もしない
  If Subfol Is Nothing Then
  Else
    For Each SubFolderBuf In Subfol
    
      Call Loop_LISTUP(SubFolderBuf.Path, count, PF)
  
    Next
  End If

End Sub
*----------------------------------------*
・ツリー全体表示

【75497】Re:別Sheetにあるデータを検索
発言  daiya  - 14/4/20(日) 14:22 -

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

関数で=VLOOKUPはsheetでは出来ましたが、マクロでそれが使えるとは
思っていませんでした、やってみます。

ありがとうございました。
・ツリー全体表示

【75496】Re:別Sheetにあるデータを検索
発言  γ  - 14/4/18(金) 20:52 -

引用なし
パスワード
   こんにちは。
一般機能であればVlookupを使うのでは?

WorksheetFunction.VLookup
のように頭にWorksheetFunction.をつけると
同じように使えます。
(該当データが無い場合のエラー対応を考えて、
 WorksheetFunctionのかわりにApplicationを使う方法もあります。)
まずは、WorksheetFunctionでトライしてみては?
・ツリー全体表示

【75495】別Sheetにあるデータを検索
質問  daiya  - 14/4/18(金) 12:32 -

引用なし
パスワード
   皆様大変お世話になります。

Excel2007で、OSは7
作業シートに個人のデータを入力してあります。

AーNo B−コードNo C−氏 D−名 E−フリガナ

Sheet1でコード入力セル、検索ボタンを作りました。
コード入力セルにコードを入力し、検索ボタンをクリックすれば氏名が反映する
マクロがわかりません、どうぞよろしくお願いいたします。
・ツリー全体表示

【75494】Re:VBAにてメール送信が、タスクスケジュ...
発言  γ  - 14/4/15(火) 20:15 -

引用なし
パスワード
   「ユーザーがログオンしているかどうかにかかわらず実行する」
でネット上で検索すると、少し悲しい話がでてきます。
ht tp://support.microsoft.com/kb/257757/ja
ht tp://social.technet.microsoft.com/Forums/ja-JP/5ffb8182-4d69-4ba0-bf78-23ac2b5b7fb7

私ができることはここまでです。
・ツリー全体表示

【75493】Re:VBAにてメール送信が、タスクスケジュ...
発言  yoshi E-MAIL  - 14/4/15(火) 9:59 -

引用なし
パスワード
   ▼γ さん:
>タスクスケジューラの利用はどのようにされているのでしょうか。
>
>また、タスクスケジューラで実行したときに、
>ユーザーの確認を求めるような動作になっているといったことは
>ないでしょうか。セキュリティ関連?
>確認してみて下さい。
>
>コードそのものは、動きましたので、問題はないのかもしれません。

返信ありがとうございます。
Workbook_openに記載変更し、タスクスケジューラにて動作させたところ、
「ユーザーがログオンしている時のみ実行する」だと、動作しました。
ただ、ログオフしているときも動作させたいため、
「ユーザーがログオンしているかどうかにかかわらず実行する」にチェックすると、また動作しなくなってしまいました。。

拙い知識ですみません。
なにがあるんでしょうか。。わからない状態です。。
・ツリー全体表示

【75492】Re:Private Sub Worksheet_Calculate() ...
お礼  まめ  - 14/4/15(火) 9:48 -

引用なし
パスワード
   ▼γ さん:

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

セル指定がSheets(1).Range("A1") となっていたので
頭にThisWorkbook.をつけたところ無事現象は解決しました。

単純なことですが、セル指定ひとつ取っても難しいのだと感じました。
この度はありがとうございました。
・ツリー全体表示

【75491】Re:VBA ループ コードのご教授
発言  ルーツ  - 14/4/14(月) 21:02 -

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

説明不足で大変申し訳ありません。

ご指摘の通りブランクになったら処理を抜けたいのと
シート1のCG3で転記を終わらせたいです。

現在、組み込まれているコードに 追加で組んでいまして
そのせいなのか セル番地 YW3まで入力されてしまいます。

別シートで検証した結果問題なく処理が完了したことで
現在、組まれているコードに組もうとしているコードが悪さしていると思いました。

もう一度 見直しを行ってみます。

それでも分からないときは またお知恵をお借りしたいと思いますので
宜しければ お力添えのほどよろしくお願いいたします。


▼γ さん:
>範囲自体は広くとっておくのだが、
>ブランクのところに来たら、処理を抜けると言う意味ですか?
># 勝手な推測ですが。
>
>Sub test()
>  Dim rng As Range, i As Long
>  For Each rng In Worksheets("Sheet1").Range("D1:O1")
>    If IsEmpty(rng.Value) Then Exit For
>    Worksheets("Sheet2").Range("H3").Offset(, 7 * i).Value = rng.Value
>    i = i + 1
>  Next rng
>End Sub
・ツリー全体表示

【75490】Re:九九を途中で止めるプログラムを作成した...
お礼  ガイツ  - 14/4/14(月) 20:50 -

引用なし
パスワード
   γ様。今晩は。最後までお付き合い頂きありがとうございました。

>何か勘違いをしていました。九九を復習しなければ・・・。
→すみません。完全に私の言葉不足でした…

>一回でも55を超えたら終了するのであれば、
>Exit Sub ですね。
>
>Sub 掛け算で答えが55以下を表示し、その後はループしない()
>  Dim i As Long
>  Dim j As Long
>  Dim a As Long
>  Dim sheetobj As Worksheet
>  
>   Set sheetobj = ThisWorkbook.Worksheets("Sheet1")
>  With sheetobj
>    a = 55
>    For i = 1 To 9
>      For j = 1 To 9
>        If i * j > a Then
>          Exit Sub
>        Else
>          .Cells(i + 1, j + 1).Value = i * j
>        End If
>      Next j
>    Next i
>  End With
> End Sub
→やはりこの場合Exit Subで終わらせるのが筋ということですね。
 実はお恥ずかしながらExit Subというのも今回教えて頂き、初めて
 知りました。

 色々とご教授頂き、有難う御座いました。
・ツリー全体表示

【75489】Re:VBA ループ コードのご教授
発言  γ  - 14/4/14(月) 20:13 -

引用なし
パスワード
   範囲自体は広くとっておくのだが、
ブランクのところに来たら、処理を抜けると言う意味ですか?
# 勝手な推測ですが。

Sub test()
  Dim rng As Range, i As Long
  For Each rng In Worksheets("Sheet1").Range("D1:O1")
    If IsEmpty(rng.Value) Then Exit For
    Worksheets("Sheet2").Range("H3").Offset(, 7 * i).Value = rng.Value
    i = i + 1
  Next rng
End Sub
・ツリー全体表示

【75488】Re:VBA ループ コードのご教授
発言  γ  - 14/4/14(月) 20:04 -

引用なし
パスワード
   ▼ルーツ さん:
>シート2の列数が 数列増えそうなので
>シート2の O1に達したらループを終わらせたいです。

O1も含めて実行するなら、
For Each rng In Worksheets("Sheet1").Range("D1:G1")
としたら良いのでは?

実は、質問の趣旨がよくわかっていないので、
↑で違っていたら、もう一度説明してください。
・ツリー全体表示

【75487】Re:VBA ループ コードのご教授
発言  ルーツ  - 14/4/14(月) 19:51 -

引用なし
パスワード
   お世話になります。
ご連絡ありがとうございます。

シート2の列数が 数列増えそうなので
シート2の O1に達したらループを終わらせたいです。
・ツリー全体表示

【75486】Re:VBAにてメール送信が、タスクスケジュ...
発言  γ  - 14/4/14(月) 19:48 -

引用なし
パスワード
   タスクスケジューラの利用はどのようにされているのでしょうか。

また、タスクスケジューラで実行したときに、
ユーザーの確認を求めるような動作になっているといったことは
ないでしょうか。セキュリティ関連?
確認してみて下さい。

コードそのものは、動きましたので、問題はないのかもしれません。
・ツリー全体表示

【75485】Re:Private Sub Worksheet_Calculate() ...
発言  γ  - 14/4/14(月) 19:26 -

引用なし
パスワード
   そのWorksheet_Calculateが書かれているシートに、
他のブックのセルを参照している箇所がありませんか?
・ツリー全体表示

【75484】Re:VBA ループ コードのご教授
発言  γ  - 14/4/14(月) 19:21 -

引用なし
パスワード
   ▼ルーツ さん:
>>下記のコードでループを抜ける方法はありますか。
いつ、どういう条件の時に抜けたいのですか?
・ツリー全体表示

【75483】Private Sub Worksheet_Calculate() が...
発言  まめ  - 14/4/14(月) 15:14 -

引用なし
パスワード
   お世話になります。

Private Sub Worksheet_Calculate()を用いたブックがあります。
データ群をブック内に貼り付けた際、最大値・最小値を計算し
グラフの表示範囲に適用するためです。

しかし、このブックを開いた状態で他のエクセルブックを
使用していると、このマクロが反応してしまいエラーが出てしまいます↓

実行時エラー9
インデックスが有効範囲にありません

このエラーが出ないようにするにはどのようにしたら良いでしょうか。
よろしくお願いいたします。
・ツリー全体表示

【75482】Re:VBA ループ コードのご教授
発言  ルーツ  - 14/4/14(月) 15:04 -

引用なし
パスワード
   ▼ルーツ さん:
>シート2のD列〜K列までの1行目を
>シート1のH3、O3、V3〜CG3と7列おきに転記したいです。
>
>下記のコードでループを抜ける方法はありますか。
>Dim rng As Range, i As Long
>For Each rng In Worksheets("Sheet1").Range("D1:K1”)
>Worksheets("Sheet2").Range("H3").Offset(, 7 * i).Value = rng.Value
>i = i + 1
>Next rng
>
>申し訳ございませんがご教授お願いいたします。
>
>独学中の初心者です。
>宜しくお願い致します。

G1ではなくK1でした。
・ツリー全体表示

【75481】VBAにてメール送信が、タスクスケジュー...
質問  yoshi E-MAIL  - 14/4/14(月) 12:07 -

引用なし
パスワード
   VBAをかじったぐらいの者です。
Excel VBAにて下記を組んで、Auto_Openに記述して、自動メール送信をしています。
手動にて動作させる分には動作するのですが、タスクスケジューラにて動作させようとすると、動作しません。。

なにがいけないのか。。全然わからない状態です。。
すみませんが、ご教授をお願いいたします。

コード:

  Dim Ap As Object
  Dim M As Object
  Dim strMOJI(2) As String
  Dim Ldate As Date
      
  
  Application.DisplayAlerts = False

  ActiveWorkbook.UpdateLinks = xlUpdateLinksAlways
  
  
  Ldate = Date - 1
  
  Worksheets("Report(Nr)").Select
  Range("E2").Value = Ldate
  
  Range("A1:Y72").Select
  Selection.CopyPicture Appearance:=xlScreen, Format:=xlBitmap

'ここまではメールに張り付けるデータを作成しており、動作するのを確認しております。


  Set Ap = CreateObject("Outlook.Application")
  Set M = Ap.CreateItem(0)
    strMOJI(0) = "各位 お疲れ様です。 " & Range("E2").Value & " の状況を報告いたします。" & vbCrLf
    strMOJI(1) = vbCrLf & " 以上です。" & vbCrLf
    strMOJI(2) = strMOJI(0) & strMOJI(1)
    strMOJI(2) = Replace(strMOJI(2), vbCrLf, "<br>")
    M.BodyFormat = 3            'リッチテキスト形式
    M.HTMLBody = "" & strMOJI(2) & ""        'メールの本文
    M.To = Range("AB7").Value & ";" & Range("AC7").Value 'To アドレス
    M.Cc = Range("AB8").Value & ";" & Range("AC8").Value 'Cc アドレス
    M.Bcc = Range("AB9").Value & ";" & Range("AC9").Value 'Cc アドレス
    M.Subject = Range("E2").Value & " 稼働報告"  '件名
    M.Display '画面を表示

    n = Len(strMOJI(0))
    With Ap.ActiveInspector.WordEditor.Windows(1).Selection
       '貼り付け
      .GoTo 3, 1, 2
      .Paste
    End With

    M.Send

  ActiveWorkbook.Save

  Application.Quit
  ThisWorkbook.Close False
・ツリー全体表示

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