Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |

2017-10-05(Thu)

PowerShell - 音量のコントロール

PowerShellからボリュームコントロールできる情報を見つけたのでメモ。VolumeとMuteプロパティへのアクセスができるようになる。

Windows7PowerShell Ver.2の場合は、1行目を以下の様に変更する。

Add-Type -Language CSharpVersion3 -TypeDefinition @'

参考サイト

Toying with audio in powershell


ソース

Add-Type -TypeDefinition @'

using System.Runtime.InteropServices;
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume {
  // f(), g(), ... are unused COM method slots. Define these if you care
  int f(); int g(); int h(); int i();
  int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
  int j();
  int GetMasterVolumeLevelScalar(out float pfLevel);
  int k(); int l(); int m(); int n();
  int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
  int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice {
  int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator {
  int f(); // Unused
  int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }
public class Audio {
  static IAudioEndpointVolume Vol() {
    var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
    IMMDevice dev = null;
    Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
    IAudioEndpointVolume epv = null;
    var epvid = typeof(IAudioEndpointVolume).GUID;
    Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
    return epv;
  }
  public static float Volume {
    get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}
    set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}
  }
  public static bool Mute {
    get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
    set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
  }
}

'@

[audio]::Mute = $false
[audio]::Volume = 0.5  # 50%

2017-08-23(Wed)

Visual Studio Community 2017 オフラインインストール

手順はこちらに書かれているとおり

vs_community.exeの取得

上記リンクからダウンロードする。


ローカル インストール キャッシュ作成

今回は .NET デスクトップ開発のみ取得し、C:\VS2017lyoutフォルダに保存。ダウンロードサイズはトータルで約1.7GBとなった。最初に取得した vs_community.exe は削除。

vs_community.exe --layout c:\vs2017layout --add Microsoft.VisualStudio.Workload.ManagedDesktop --includeOptional --lang ja-JP

インストール

c:\vs2017layout\vs_community.exe --add Microsoft.VisualStudio.Workload.ManagedDesktop --includeOptional

2017-08-12(Sat)

EXCEL VBAメモ - xlsmファイル中のマクロの書き換え

マクロ入りの雛形ファイルをコピーして作成されたExcelファイルが多数ある場合の一括マクロ更新などに使用。



基本的に更新対象ファイルの対象モジュールの内容を一括削除して、予め更新マクロ用Excelファイルに用意した、同名のモジュールの内容をそのままコピーさせるのがわかり易いかな。

事前設定

更新用マクロを動作させるExcelで以下の設定を行う

ファイル

→オプション

→セキュリティセンター

→セキュリティセンターの設定

→マクロの設定

→VBAプロジェクトオブジェクトモデルへのアクセスを信頼する。にチェック


各機能用のプロシージャ

コードモジュールの行数表示

Private Sub コードモジュールの行数表示()
    Dim cnt As Long
    cnt = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.CountOfLines
    MsgBox "Module1の行数 " & cnt
    
    cnt = ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule.CountOfLines
    MsgBox "Sheet1の行数 " & cnt
End Sub

ThisWorkbookの全行を削除

Private Sub ThisWorkbook全行削除()
    Dim cnt As Long
    With ThisWorkbook.VBProject.VBComponents("ThisWorkbook")
        cnt = .CodeModule.CountOfLines
        .CodeModule.DeleteLines 1, cnt
    End With
End Sub

Sheetモジュールの全行を削除

Private Sub シートモジュール全行削除()
    Dim cnt As Long
    With ThisWorkbook.VBProject.VBComponents("Sheet1") ' "Sheet1"はオブジェクト名であり、Nameプロパティの値ではない
        cnt = .CodeModule.CountOfLines
        .CodeModule.DeleteLines 1, cnt
    End With
End Sub

Module1の全行を削除

Private Sub コードモジュール全行削除()
    Dim cnt As Long
    cnt = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.CountOfLines
    ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.DeleteLines 1, cnt
End Sub

Module3の全行をModule1へコピー

Sub コードモジュールを別モジュールへコピー()
    Dim Code As String
    With ThisWorkbook.VBProject.VBComponents("Module3").CodeModule
        Code = .Lines(1, .CountOfLines)
    End With
    With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        .AddFromString Code
    End With
End Sub

Module1の全行をTarget.xlsmのModule1へコピー

Sub コードモジュールを別ブックへコピー()
    Dim decLine As Long
    Dim allLine As Long
    
    Dim Code As String
    Dim wb As Workbook
    
    Set wb = Workbooks.Open("C:\Users\〇〇\Target.xlsm")
    
    With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
        allLine = .CountOfLines              ' 全行数
        decLine = .CountOfDeclarationLines   ' 宣言部行数
    
        ' 宣言部以外のコードをコピー
        Code = .Lines(decLine + 1, allLine - decLine)
    End With
    With wb.VBProject.VBComponents("Module1").CodeModule
        .AddFromString Code
    End With

    wb.Save
    wb.Close
End Sub

Module1を解放

Private Sub コードモジュール解放()
    With ThisWorkbook.VBProject
        .VBComponents.Remove .VBComponents("Module1")
    End With
End Sub

Module1をインポート

Private Sub コードモジュールインポート()
    With ThisWorkbook.VBProject
        .VBComponents.Import ThisWorkbook.Path & "\Module1.bas"
    End With
End Sub

標準Moduleを追加(Module名は自動でModule xになる)

Private Sub 標準モジュール追加()
    With ThisWorkbook.VBProject
        .VBComponents.add vbext_ct_StdModule
    End With
End Sub

標準Moduleをリストアップ

Private Sub 標準モジュール数表示()
    Dim cnt As Long, i As Long
    Dim msg As String


    With ThisWorkbook.VBProject
        msg = "全モジュールの個数:" & .VBComponents.Count & vbNewLine
        cnt = 0
        For i = 1 To .VBComponents.Count
            If .VBComponents(i).Type = vbext_ct_StdModule Then
                cnt = cnt + 1
                msg = msg & .VBComponents(i).Name & vbNewLine
            End If
        Next
        msg = msg & "標準モジュールの個数:" & cnt
    End With
    MsgBox msg
End Sub