Excel VBA質問箱 IV

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

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


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

【79281】フォルダ内パスワード一括設定について
質問  VBA  - 17/6/30(金) 14:23 -

引用なし
パスワード
   初めまして、VBA勉強中の者です。

【前提】
フォルダ内にある多数のファイルについてまとめて1つのパスワードを設定したいと考えています。
なお、フォルダ内にパスワードが設定されているファイルとされていないファイルが混在しているため、一旦全てパスワードを解除した後、まとめてパスワードを設定する必要があります。
各所を参考に、2つコードを入力したのですが、以下2点についてご教示いただければ幸いです。
(Excel2010を使用しています。)

【質問内容】
(1)下記コードのうち、Excel版は問題なく動作するのですが、Word版を実行したところ「実行時エラー'424":オブジェクトが必要です」と出てしまいます。修正方法をご教示いただけないでしょうか。(エラー箇所は★の部分)

(2)今回のマクロでは当該フォルダのみを動作の対象としていますが、下層フォルダもまとめて一括で動作するように設定はできないものでしょうか。

【入力コード(※設定したいパスワードが「aaa」の場合】
1.Excel版
Sub パスワードExcel()
  Dim myfolder, myfn, myword, pwopen, pwclose
  Dim pattern
  '操作を選択
  pattern = MsgBox("パスワード解除ならば「はい」、セットならば「いいえ」", vbYesNo)
  If pattern = vbCancel Then
    Exit Sub
  End If
  'パスワードをセット
  myword = "aaa"
  If pattern = vbYes Then
    pwopen = myword
    pwclose = ""
  ElseIf pattern = vbNo Then
    pwopen = ""
    pwclose = myword
  End If
  'フォルダを選択
  With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "操作したいファイルのあるフォルダを選択"
    .AllowMultiSelect = False
    If .Show = -1 Then
      myfolder = .SelectedItems(1)
    Else
      Exit Sub
    End If
  End With
  'ファイルを操作
  myfn = Dir(myfolder & "\*.xls*", vbNormal)
  Do Until myfn = ""
    Call ファイル開閉(myfolder & "\" & myfn, pwopen, pwclose)
    myfn = Dir
  Loop
End Sub
Function ファイル開閉(myfn, pwopen, pwclose)
  Workbooks.Open Filename:=myfn, passWord:=pwopen
  Application.DisplayAlerts = False
  ActiveWorkbook.SaveAs Filename:=myfn, passWord:=pwclose, WriteResPassword:=""
  Application.DisplayAlerts = True
  ActiveWorkbook.Close
End Function

2.Word版
Sub パスワードWord()
  'フォルダ内の共通のパスワードがセットされた文書を連続して開き、解除して上書き保存。
  '逆にフォルダ内の文書を連続して開き、共通のパスワードをセットして上書き保存。
  Dim onoff As Long
  Dim mypw, pwopen, pwclose, mypath, myfn As String
  '操作を選択
  onoff = MsgBox("パスワード解除ならば「はい」、セットならば「いいえ」", vbYesNo)
  If onoff = vbCancel Then
    Exit Sub
  End If
  'パスワードをセット
  mypw = "aaa"
  If onoff = vbYes Then
    pwopen = mypw
    pwclose = ""
  ElseIf onoff = vbNo Then
    pwopen = ""
    pwclose = mypw
  Else
    Exit Sub
  End If
  'フォルダの選択
  With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = "フォルダを選択"
    .AllowMultiSelect = False
    If .Show = -1 Then
      mypath = .SelectedItems(1) & "\"
    Else
      Exit Sub
    End If
  End With
  'ファイルの取得と実行
  myfn = Dir(mypath & "*.doc*", vbNormal)
  Do Until myfn = ""
    '開
    ★Documents.Open FileName:=mypath & myfn, PasswordDocument:=pwopen★
    '文末に改行を挿入し削除(何らかの変更がないと上書き保存できない)
    Selection.EndKey Unit:=wdStory
    Selection.TypeParagraph
    Selection.MoveLeft Unit:=wdCharacter, Count:=1
    Selection.Delete Unit:=wdCharacter, Count:=1
    '上書き保存
    ActiveDocument.SaveAs Filename:=ActiveDocument.FullName, passWord:=pwclose, WritePassword:=""
    ActiveWindow.Close
    myfn = Dir
  Loop
End Sub
・ツリー全体表示

【79280】Re:チェックボックスがONの場合に選択し...
お礼  ペーターパン  - 17/6/30(金) 12:33 -

引用なし
パスワード
   ▼マナ さん:
返信が遅れて申し訳ありません。

業務上、CSVファイルやエクセルファイルの数値チェックを行うことが多いため、個人用にアドインを作りたいと考えていました。
下記、よく読んで自分の至らなかった点を確認してみます。


>▼ペーターパン さん:
>
>試したのは、こんな感じです。
>
>Option Explicit
>
> Dim WithEvents xlApp As Application
> Dim bLine As Range
>
>
>Private Sub Workbook_Open()
>  Set xlApp = Application
>  
> With xlApp.CommandBars("Cell").Controls.Add(before:=1)
>  .Caption = "強調表示OFF"
>  .OnAction = "thisworkbook.メニュ切り替え"
>  ThisWorkbook.Sheets(1).Cells(1).Value = False
> End With
>  
>End Sub
>
>Private Sub Workbook_BeforeClose(Cancel As Boolean)
>
>  If Not bLine Is Nothing Then bLine.Font.Bold = False
>  xlApp.CommandBars("Cell").Controls(1).Delete
>  
>End Sub
>
>Private Sub メニュ切り替え()
>  
>  With ThisWorkbook.Sheets(1).Cells(1)
>    If .Value = False Then
>      xlApp.CommandBars("Cell").Controls(1).Caption = "強調表示ON"
>    Else
>      xlApp.CommandBars("Cell").Controls(1).Caption = "強調表示OFF"
>    End If
>    .Value = Not .Value
>  End With
>   
>End Sub
>
>
>Private Sub xlApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
>
>  If Not bLine Is Nothing Then
>    bLine.Font.Bold = False
>    Set bLine = Nothing
>  End If
>  If ThisWorkbook.Sheets(1).Cells(1).Value Then
>    Selection.EntireRow.Font.Bold = True
>    Set bLine = Selection.EntireRow
>  End If
>  
>End Sub
・ツリー全体表示

【79279】Re:隣のセルが空白でない場合に値を入力...
回答  VBA勉強始めました  - 17/6/28(水) 9:36 -

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

度々返信が遅くなり申し訳ありません。

ご教授頂いたVBAですが
最後の2行のコマンドは初めて見た為
完全には理解できておりませんが
A1のセルを含めてデータが入力されている範囲を選択し
その範囲の中からA列だけを選択しているということでしょうか?

ステップで実行し、ご教授頂いたVBAで
数値を入力したいセル範囲を選択することができました!

>Sub test()
>  Dim ws As Worksheet
>  
>  Set ws = ActiveSheet  ⇒アクティブなシートを選択
>  
>  ws.Columns(1).Insert  ⇒アクティブなシートのA列に挿入
>  ws.Range("A1").Select  ⇒アクティブなシートのA1セルを選択
>  ws.Range("A1").CurrentRegion.Select
>  ws.Range("A1").CurrentRegion.Columns(1).Select
>  
>End Sub

>▼VBA勉強始めました さん:
>
>下記マクロの意味がわかりますか。
>ステップ実行で1行ずつ確認してください。
>数値を入れたいセル範囲を選択できましたか?
>
>Option Explicit
>
>Sub test()
>  Dim ws As Worksheet
>  
>  Set ws = ActiveSheet
>  
>  ws.Columns(1).Insert
>  ws.Range("A1").Select
>  ws.Range("A1").CurrentRegion.Select
>  ws.Range("A1").CurrentRegion.Columns(1).Select
>  
>End Sub
・ツリー全体表示

【79278】Re:WMIを利用したWindowsイベントログの...
お礼  ギケン  - 17/6/27(火) 9:26 -

引用なし
パスワード
   hatena 様

ありがとうございます!

さっそくご教示頂いたとおり記載し、無事思い通りのログ出力されました!

hatena様に頂いたコードを改めて拝見すると、自分では辿り着かなかった(辿り着いたとしても今回の件には間に合わない)と思います。

大変助かりました。

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

【79277】Re:WMIを利用したWindowsイベントログの...
回答  hatena  - 17/6/26(月) 22:02 -

引用なし
パスワード
   ▼ギケン さん:
>イベントログの抽出条件(日付指定のみ)を指定したSQLを実行
>Set colEvents = objWMIService.ExecQuery _
>  ("Select * from Win32_NTLogEvent Where TimeWritten >= '" & utcStartDate & "'")

下記のような感じで。(変数宣言は適宜追加してください。)

'UTC日時値に変換するためのオブジェクトを作成
Set utcStartDate = CreateObject("WbemScripting.SWbemDateTime")
Set utcEndDate = CreateObject("WbemScripting.SWbemDateTime")

'開始日、終了日の設定
StartDate = #5/1/2017#
EndDate = #6/1/2017#

'UTC日時に変換
utcStartDate.SetVarDate StartDate, True
utcEndDate.SetVarDate EndDate, True


'中略

Set colEvents = objWMIService.ExecQuery _
  ("Select * from Win32_NTLogEvent Where (EventCode = 12 Or EventCode = 13) And " & _
   "TimeWritten >= '" & utcStartDate & "' AND TimeWritten < '" & utcEndDate & "'")
・ツリー全体表示

【79276】WMIを利用したWindowsイベントログの取得
質問  ギケン E-MAIL  - 17/6/26(月) 15:09 -

引用なし
パスワード
   はじめまして。

勤怠管理用(出勤簿)にWindowsの開始時間、シャットダウン時間を取得しようとしています。

Windowsの「システムログ」からイベントIDの「12(Windowsの開始)」と「13(Windowsのシャットダウン)」日時を一覧(一ヶ月分)で取得したいです。

出勤簿の処理に使用しますので、「指定日時」〜「指定日時」の一ヶ月間のログが欲しいのです。

現状、以下ページを参考に取得を試みました。

http://vba−geek.jp/blogーentry−314.html

実行した結果、ログは取得出来るのですが「すべてのログ」が「1日分だけ」取得されます。

処理完了までの時間も長いです。

ログが4000~5000行ある中で必要なのは2行だけですので、なんとかピンポイントでその2行だけ取得したいです。


WMIオブジェクトの参照
Set objWMIService = GetObject("winmgmts:" _
  & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

イベントログの抽出条件(日付指定のみ)を指定したSQLを実行
Set colEvents = objWMIService.ExecQuery _
  ("Select * from Win32_NTLogEvent Where TimeWritten >= '" & utcStartDate & "'")


↑このあたりを修正するのかなと思いましたが、試した限り上手く行きませんでした。

結構ググりましたが情報見つけること出来ず、手持ちの資料にもWMIについて記載されたものありませんでしたので質問させていただきました。

もしおわかりになられる方がいらっしゃればご教示頂きたく、もしくはヒント頂けるだけでもありがたいので、よろしくお願いいたします。
・ツリー全体表示

【79275】Re:チェックボックスがONの場合に選択し...
発言  マナ  - 17/6/24(土) 19:21 -

引用なし
パスワード
   ▼ペーターパン さん:

試したのは、こんな感じです。

Option Explicit

Dim WithEvents xlApp As Application
Dim bLine As Range


Private Sub Workbook_Open()
  Set xlApp = Application
  
 With xlApp.CommandBars("Cell").Controls.Add(before:=1)
  .Caption = "強調表示OFF"
  .OnAction = "thisworkbook.メニュ切り替え"
  ThisWorkbook.Sheets(1).Cells(1).Value = False
 End With
  
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

  If Not bLine Is Nothing Then bLine.Font.Bold = False
  xlApp.CommandBars("Cell").Controls(1).Delete
  
End Sub

Private Sub メニュ切り替え()
  
  With ThisWorkbook.Sheets(1).Cells(1)
    If .Value = False Then
      xlApp.CommandBars("Cell").Controls(1).Caption = "強調表示ON"
    Else
      xlApp.CommandBars("Cell").Controls(1).Caption = "強調表示OFF"
    End If
    .Value = Not .Value
  End With
   
End Sub


Private Sub xlApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

  If Not bLine Is Nothing Then
    bLine.Font.Bold = False
    Set bLine = Nothing
  End If
  If ThisWorkbook.Sheets(1).Cells(1).Value Then
    Selection.EntireRow.Font.Bold = True
    Set bLine = Selection.EntireRow
  End If
  
End Sub
・ツリー全体表示

【79274】Re:オートシェイプ
発言  マナ  - 17/6/24(土) 19:15 -

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

>全然わからなくなってしまいました。

何がわからないのでしょうか。
とりあえず試してみたことを教えてください。

現在の「普通」だけのコードは理解できているのですか?
・ツリー全体表示

【79273】Re:オートシェイプ
発言  AS  - 17/6/24(土) 18:53 -

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

全然わからなくなってしまいました。

参考にコードを教えて頂けないでしょうか?
・ツリー全体表示

【79272】Re:If
発言  マナ  - 17/6/24(土) 16:39 -

引用なし
パスワード
   ▼トキノハジメ さん:

>回答が付かないので閉じさせていただきます。

条件付き書式ではだめでしたか?
・ツリー全体表示

【79271】Re:If
お礼  トキノハジメ  - 17/6/24(土) 16:00 -

引用なし
パスワード
   ▼みなさん有り難うございました。

回答が付かないので閉じさせていただきます。

また宜しくお願い致します。
・ツリー全体表示

【79270】Re:チェックボックスがONの場合に選択し...
発言  マナ  - 17/6/24(土) 12:28 -

引用なし
パスワード
   ▼ペーターパン さん:

なぜアドインなのでしょうか。
ちょっと試してみましたが
メリットが感じられませんでした。

「元に戻す」の機能が使えなくなるのは気にしないのでしょうか。
特定ファイルにのみに適用するマクロではないのでしょうか。
・ツリー全体表示

【79269】Re:オートシェイプ
発言  マナ  - 17/6/24(土) 8:04 -

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

>>ht tp://excelvba.pc-users.net/fol6/6_1.html 
>>

if "普通" then
 …
elseif "異常" then
 …
else
 …
end if

こんな感じで考えてみてください
・ツリー全体表示

【79268】Re:オートシェイプ
発言  AS  - 17/6/24(土) 7:21 -

引用なし
パスワード
   ▼マナ さん:
>▼AS さん:
>
>こんな感じです。
>ht tp://excelvba.pc-users.net/fol6/6_1.html 
>
>1)"普通"ならば
>"普通"のオートシェイプを表示
>"異常"のオートシェイプを非表示
>2)"異常"ならば
>"普通"のオートシェイプを非表示
>"異常"のオートシェイプを表示
>3)それ以外は、
>"普通"のオートシェイプを非表示
>"異常"のオートシェイプを非表示
>
>
>別シートの件は、これができてからでよいですか。


上記の条件で問題ありません。
宜しくお願い致します。
・ツリー全体表示

【79267】Re:オートシェイプ
発言  マナ  - 17/6/23(金) 20:41 -

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

こんな感じです。
ht tp://excelvba.pc-users.net/fol6/6_1.html 

1)"普通"ならば
"普通"のオートシェイプを表示
"異常"のオートシェイプを非表示
2)"異常"ならば
"普通"のオートシェイプを非表示
"異常"のオートシェイプを表示
3)それ以外は、
"普通"のオートシェイプを非表示
"異常"のオートシェイプを非表示


別シートの件は、これができてからでよいですか。
・ツリー全体表示

【79266】Re:オートシェイプ
発言  AS  - 17/6/23(金) 20:02 -

引用なし
パスワード
   >データリストとは何でしょうか?

データの入力規則のリストです。

A1に"普通"と"異常"の入力規則のリストがあり、

"普通"を選択すれば、B10にある"普通"のオートシェイプが表示され、
"異常"のオートシェイプは、非表示。

"異常"を選択すれば、D10にある"異常"のオートシェイプが表示され、
"普通"のオートシェイプが非表示にしたいのです。

又、空白の場合は両方非表示です。

データの入力規則のリストは、別シートのA1にしたいです。

説明が下手ですいません。

宜しくお願い致します。
・ツリー全体表示

【79265】Re:オートシェイプ
発言  マナ  - 17/6/23(金) 18:58 -

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

>A1セルに普通、異常のデータリストがあります
>普通を選択するとB10セルにオートシェイプで丸をするようにしました。

>異常の場合でもオートシェイプで丸をつけたいのですが
>どのように記述すれば良いのでしょうか?

データリストとは何でしょうか?
普通と異常しかないのであれば、常にオートシェイプは表示状態ではないのですか
どうなったら非表示にしたいのでしょうか?
・ツリー全体表示

【79264】Re:隣のセルが空白でない場合に値を入力...
発言  マナ  - 17/6/23(金) 18:45 -

引用なし
パスワード
   ▼VBA勉強始めました さん:

下記マクロの意味がわかりますか。
ステップ実行で1行ずつ確認してください。
数値を入れたいセル範囲を選択できましたか?

Option Explicit

Sub test()
  Dim ws As Worksheet
  
  Set ws = ActiveSheet
  
  ws.Columns(1).Insert
  ws.Range("A1").Select
  ws.Range("A1").CurrentRegion.Select
  ws.Range("A1").CurrentRegion.Columns(1).Select
  
End Sub
・ツリー全体表示

【79263】Re:チェックボックスがONの場合に選択し...
質問  ペーターパン  - 17/6/23(金) 17:59 -

引用なし
パスワード
   もし、下記のコードをアドインにしようとした場合、どうすればよいでしょうか?
過去の質問に再質問で申し訳ありませんが、何卒宜しくお願い致します。

>▼β さん:
>ありがとうございます。
>
>モジュールレベルで変数を宣言する。
>if not構文で宣言する。
>どちらも今の私ではたどり着けない答えでした。
>
>Worksheet_SelectionChangeの場合、イベント発生の度に変数がどうなっているかよく考えなくてはいけないのですね。
>自分が試しに作ったものだと太字が延々と作られ続けた理由がよくわかりました。
>
>壁にぶつかってまた1つ成長できました。
>これからも精進します。
>
>>▼ペーターパン さん:
>>
>>元々アップしたコードの Cellsを必要行のみにするとどうでしょうか?
>>
>>
>>Option Explicit
>>
>>Dim bLine As Range
>>
>>Private Sub Worksheet_SelectionChange(ByVal Target As Range)
>>  If Not bLine Is Nothing Then
>>    bLine.Font.Bold = False
>>    Set bLine = Nothing
>>  End If
>>  If CheckBoxes("ChkBx1").Value = xlOn Then
>>    Selection.EntireRow.Font.Bold = True
>>    Set bLine = Selection.EntireRow
>>  End If
>>End Sub
・ツリー全体表示

【79262】Re:隣のセルが空白でない場合に値を入力...
発言  VBA勉強始めました  - 17/6/23(金) 16:25 -

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

返信が遅くなり申し訳ありません。
投稿した翌日から風邪で寝込んでおりました…。

B列の途中には空白はありません。

宜しくお願い致します。

>▼VBA勉強始めました さん:
>
>>この挿入したA列にB列が空白ではない場合
>>数値を入力したいと考えているのですが
>
>B列の途中の行に空白はあるのでしょうか。
>それとも、データはすべて埋まっているのでしょうか。
・ツリー全体表示

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