ExcelVBAでwindowsバージョン(10とか11とか) 返す

'OSのバージョンの数値を返す win10=10 win11=11
Function GetOsVersion()

    ' 取得結果を格納する変数を宣言
    Dim lnArchitecture As Long
    Dim strCaption As String
    Dim strCSDVersion As String
    Dim strOSVersion As String

    ' 初期値を入れておく
    lnArchitecture = 32
    strCaption = ""
    strCSDVersion = "Service Pack 0"

On Error Resume Next

    Dim objOS As Object
    Dim i As Long
    ' Connect to WMI and obtain instances of Win32_OperatingSystem
    For Each objOS In GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem")
        ' アーキテクチャの取得
On Error GoTo OSArchitectureNoSupport
        If InStr(1, CStr(objOS.OSArchitecture), "64", vbBinaryCompare) <> 0 Then
            lnArchitecture = 64
        End If

OSArchitectureNoSupport:
On Error Resume Next

        ' キャプションを取得
        For i = 1 To Len(objOS.Caption)
            Dim strTemp As String: strTemp = Strings.Mid$(objOS.Caption, i, 1)
            If AscW(strTemp) = &H2122 Then
                strCaption = strCaption & " TM"
            ElseIf AscW(strTemp) = &H24C7 Or AscW(strTemp) = &HAE Then
                strCaption = strCaption & "(R)"
            Else
                strCaption = strCaption & strTemp
            End If
        Next i

        ' SPを取得
        strCSDVersion = objOS.CSDVersion

        ' Versionを取得
        strOSVersion = objOS.Versionn
    Next
    
    GetOsVersion = FirstVal(strCaption)

    Set objOS = Nothing

End Function

'文字列の中から最初に見つかった数値をval()で変換して返す
Function FirstVal(str As String) As Integer

    Dim buf As String, RE, reMatch, reValue
    Set RE = CreateObject("VBScript.RegExp")
    buf = str
    With RE
        .Pattern = "\d+"
        .Global = True
        Set reMatch = .Execute(buf)
        If reMatch.count > 0 Then
            For Each reValue In reMatch
                FirstVal = Val(reValue)
                Exit For
            Next reValue
        End If
    End With
    Set RE = Nothing
    
End Function

webview2でファイルのダウンロード完了を待つ方法

webページのダウンロード待ちではなくて、PCにファイルをダウンロードするときの処理。

DevTools Protocolを使う。

ダウンロードを始めてから
m_downloadState をみてcompletedかcanceledかになるまで待つようにすればOK

Private m_downloadState As String

...

Private Sub CoreWebView2_DevToolsProtocolEventReceived(sender As Object, e As CoreWebView2DevToolsProtocolEventReceivedEventArgs)

    If InStr(e.ParameterObjectAsJson, """state"":""completed""") <> 0 Then
        m_downloadState = "completed"
    ElseIf InStr(e.ParameterObjectAsJson, """state"":""inProgress""") <> 0 Then
        m_downloadState = "inProgress"
    ElseIf InStr(e.ParameterObjectAsJson, """state"":""canceled""") <> 0 Then
        m_downloadState = "canceled"
    Else
        m_downloadState = ""
    End If

End Sub

...

Await FormE.view2.CoreWebView2.CallDevToolsProtocolMethodAsync("Page.enable", "{}")

AddHandler FormE.view2.CoreWebView2.GetDevToolsProtocolEventReceiver("Page.downloadProgress").DevToolsProtocolEventReceived, AddressOf CoreWebView2_DevToolsProtocolEventReceived

ネタ元

github.com

webview2でファイルのダウンロード先やファイル名を変更する方法

あんまり古いWebView2だとDownloadStartingが無いので注意

Private Sub CoreWebView2_DownloadStarting(sender As Object, e As CoreWebView2DownloadStartingEventArgs)

    Dim downloadOperation : downloadOperation = e.DownloadOperation
    e.ResultFilePath = "C:\hogehoge\dl.zip"

End Sub

...

AddHandler FormE.view2.CoreWebView2.DownloadStarting, AddressOf CoreWebView2_DownloadStarting

ネタ元

www.fixes.pub

.net UNIX時間取得方法

・C#

using System;

class Program
{
  static void Main()
  {
    // 現在日時を表すDateTimeオブジェクトを取得
    DateTime targetTime = DateTime.Now;
   
    long unixTime = GetUnixTime(targetTime);
    Console.WriteLine(unixTime.ToString());
    // 出力例:1266864932

    Console.ReadLine();
  }

  // UNIXエポックを表すDateTimeオブジェクトを取得
  private static DateTime UNIX_EPOCH =
    new DateTime(1970, 1, 1, 0, 0, 0, 0);

  public static long GetUnixTime(DateTime targetTime)
  {
    // UTC時間に変換
    targetTime = targetTime.ToUniversalTime();

    // UNIXエポックからの経過時間を取得
    TimeSpan elapsedTime = targetTime - UNIX_EPOCH;
   
    // 経過秒数に変換
    return (long)elapsedTime.TotalSeconds;
  }
}

・VB.net

Module Module1

  Sub Main()

    ' 現在日時を表すDateTimeオブジェクトを取得
    Dim targetTime As DateTime = DateTime.Now
   
    Dim unixTime As Long = GetUnixTime(targetTime)
    Console.WriteLine(unixTime.ToString())
    ' 出力例:1266864932

    Console.ReadLine()

  End Sub

  ' UNIXエポックを表すDateTimeオブジェクトを取得
  Private UNIX_EPOCH As DateTime = _
    New DateTime(1970, 1, 1, 0, 0, 0, 0)

  Private Function GetUnixTime(ByVal targetTime As DateTime) As Long

    ' UTC時間に変換
    targetTime = targetTime.ToUniversalTime()

    ' UNIXエポックからの経過時間を取得
    Dim elapsedTime As TimeSpan = targetTime - UNIX_EPOCH

    ' 経過秒数に変換
    Return CType(elapsedTime.TotalSeconds, Long)

  End Function

End Module

VB.NETでファイルを削除する方法色々

ファイルが存在してなくてもエラーにならない方法

  • File.Delete メソッドを使用する方法
Dim sFilePath As String = "C:\work\myfile.txt"

System.IO.File.Delete(sFilePath)
Dim sFilePath As String = "C:\work\myfile.txt"
 
System.IO.File.Delete(sFilePath)

  • FileInfo クラスを使用する方法
Dim sFilePath As String = "C:\work\myfile.txt"

Dim finfo As New System.IO.FileInfo(sFilePath)
finfo.Delete()
Dim sFilePath As String = "C:\work\myfile.txt"
 
Dim finfo As New System.IO.FileInfo(sFilePath)
finfo.Delete()

ファイルが無いとエラーを発生する方法

  • FileSystem.DeleteFile メソッドを使用する方法
Dim sFilePath As String = "C:\work\myfile.txt"

My.Computer.FileSystem.DeleteFile(sFilePath)
Dim sFilePath As String = "C:\work\myfile.txt"
 
My.Computer.FileSystem.DeleteFile(sFilePath)

ネタ元

note.websmil.com