AIによるコードの書き換え実験(VBA→JavaScript)

ファイルを整理していたら、入力した数値の九九を作るVBAを見つけました。

↓こんな感じ

f:id:cAmErA:20240422143620j:image

 

いらないので消そうかなぁと思ったのですが、せっかくならと思い実験してみました。

 

Bingが提供しているCopilotというAIで、プログラムの書き換えをやってもらいました。

 

↓Copilotにお願いした内容

JavaScriptとhtmlに書き換えてPrivate Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("B2:B2")) Is Nothing Then
Exit Sub
Else
n = Range("B2:B2")

'数字であれば
If IsNumeric(n) = True Then
'1~9の範囲内か
If n >= 1 And n <= 9 Then
'掛け算
For i = 1 To 9 Step 1
ans = n * i
Cells(3 + i, 2).Value = n & "×" & i & "=" & ans
Next i
'範囲外なら
Else
MsgBox "1~9の数字を入力して下さい"
Exit Sub
End If
'数字でなければ
Else
MsgBox "1~9の数字を入力して下さい"
Exit Sub
End If

End If
End Sub

 

↓Copilotからの回答

VBAのコードをJavaScriptとHTMLに変換することは可能です。以下に、指定されたVBAコードに相当する機能を持つJavaScriptとHTMLのコードを示します。このコードは、ユーザーがHTMLページ上の特定のフィールドに数字を入力すると、その数字の九九の表を生成します。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>九九の表</title>
<script>
document.addEventListener('DOMContentLoaded', function() {
var input = document.getElementById('inputNumber');
var result = document.getElementById('result');

input.addEventListener('input', function() {
var n = parseInt(input.value, 10);
result.innerHTML = '';

if (!isNaN(n) && n >= 1 && n <= 9) {
for (var i = 1; i <= 9; i++) {
var ans = n * i;
result.innerHTML += n + " × " + i + " = " + ans + "<br>";
}
} else {
alert("1~9の数字を入力して下さい");
}
});
});
</script>
</head>
<body>
<p>数字を入力(1~9):</p>
<input type="number" id="inputNumber" min="1" max="9">
<div id="result"></div>
</body>
</html>
```

このHTMLファイルをブラウザで開くと、ユーザーは数字を入力するフィールドを見ることができます。1から9までの数字を入力すると、その数字の九九の表が下に表示されます。範囲外の数字や数字でない値を入力した場合、アラートが表示されます。

このコードは、VBAイベントハンドラーに相当する機能をJavaScriptで実装しており、HTMLはユーザーインターフェースを提供します。VBAの `Worksheet_Change` イベントに対応するために、HTMLの `input` イベ

 

HTMLを実行してみたら、おおかた想定通りの動きをしました。

 

↓実行画面

f:id:cAmErA:20240422143325j:image

 

すごいっすねぇ〜。

プログラミングの勉強しても、AIには追いつけないかもしれないですねぇ…。

デジタルタトゥーの危険性と注意点についてまとめてみた

デジタルタトゥーの危険性と注意点についてまとめてみました。

デジタルタトゥーとは

デジタルタトゥーとは、インターネット上での個々の行動や発言が蓄積され、その人物のデジタルな足跡やプロフィールを形成する現象を指します。

これらの情報は、個人の評判や信用度を左右する可能性があります。

しかし、デジタルタトゥーの危険性は、主にプライバシーの侵害と誤解を招く可能性にあります。

一度インターネット上に公開された情報は、容易には削除できないため、不適切な投稿や過去の行動が将来的に問題を引き起こす可能性があります。

そのため、デジタルタトゥーを防ぐためには、自分のオンライン行動に対する意識を高めることが重要です。

具体的には、自分が投稿する内容をよく考え、プライバシー設定を適切に管理し、定期的に自分のデジタルタトゥーをチェックすることが推奨されます。

また、デジタルタトゥーは、今後も私たちの生活に影響を与え続けるでしょう。

そのため、デジタルリテラシーを身につけ、自分のデジタルタトゥーを適切に管理することが、これからの社会で生き抜くための重要なスキルとなります。 

 

デジタルタトゥーの危険性

デジタルタトゥーの危険性について、以下のようにまとめることができます。

  1. 永続性: 一度インターネット上に公開された情報は、容易には削除できず、全世界に広がる可能性があります。これにより、過去の不適切な投稿や行動が将来的に個人の評判や信用度を損なう可能性があります。

  2. プライバシーの侵害: 個人情報が不適切に共有されたり、悪意のある第三者によって悪用されたりすることがあります。これは、個人のプライバシーを侵害する可能性があります。

  3. 誤解の可能性: 情報が文脈から切り離されたり、誤解されたりすると、その人物の真の性格や意図とは異なる印象を与えることがあります。

  4. 深刻な影響: 上記の理由から、デジタルタトゥーの危険性は、個人の生活やキャリアに深刻な影響を及ぼす可能性があります。

これらの危険性を理解し、自分のデジタルタトゥーを適切に管理し、オンラインでの行動に注意を払うことが重要です。 

 

 

デジタルタトゥーを防ぐ方法

デジタルタトゥーを防ぐ方法について、以下のようにまとめることができます。

  1. 自己認識: 自分がオンラインで何を共有しているか、どのように perceived されているかを常に認識しておくことが重要です。これには、自分の名前で定期的にインターネット検索を行うことも含まれます。

  2. プライバシー設定: ソーシャルメディアのプライバシー設定を適切に管理し、自分の情報がどの程度公開されているかを把握することが重要です。

  3. 思慮深い投稿: オンラインでの発言や行動は、一度公開されると消去することが難しいため、投稿する前に十分に考えることが重要です。

  4. デジタルリテラシー: デジタルリテラシーを身につけることで、デジタルタトゥーのリスクを理解し、適切なオンライン行動をとることができます。

  5. 定期的な監査: 定期的に自分のデジタルタトゥーを監査し、必要に応じて情報を更新または削除することも有効です。

これらの方法を用いることで、デジタルタトゥーのリスクを最小限に抑えることができます。 

 

まとめ

デジタルタトゥーは、今後も私たちの生活に大きな影響を与えるでしょう。インターネットの普及により、私たちの行動や発言はデジタルタトゥーとして永続的に記録され、全世界に公開される可能性があります。これは、個人の評判や信用度、さらには就職や進学などの機会に影響を及ぼす可能性があります。

また、デジタルタトゥーは、個人だけでなく、企業や組織にとっても重要な意味を持つようになるでしょう。企業のオンラインでの行動や発言は、そのブランドイメージや信頼性を形成するため、適切な管理が求められます。

一方で、デジタルタトゥーの存在は、プライバシーの保護という新たな課題をもたらします。

個人情報が不適切に共有されたり、悪意のある第三者によって悪用されたりすることがあります。

そのため、デジタルリテラシーの向上とともに、プライバシー保護のための法律や規制の整備が必要となるでしょう。

これらのことから、自分のデジタルタトゥーを適切に管理し、オンラインでの行動に注意を払うことが、今後ますます重要となるでしょう。

覚えておくと便利(バッチ、VBScript)

CSVの並び順変更vbs(CSVをvbsにドラッグアンドドロップで作動)

Option Explicit

' 引数(ドラッグアンドドロップしたファイル名)を取得
Dim objArgs
Set objArgs = WScript.Arguments

Dim strFileName

If objArgs.Count = 0 Then
strFileName = InputBox("変換したい CSV のファイル名をフルパスで入力してください。")
Else
strFileName = objArgs(0)
End If

'MsgBox(strFileName)

'ファイル名が入力されなかったら終了
If strFileName = "" Then
WScript.Quit
End If

Dim objFS

'定数の定義
Const ForReading = 1,ForWriting = 2,ForAppending = 8
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")

Dim objFileInput
Dim objFileOutput
dim ymdhms

'今を取得
ymdhms=Year(Now) & Right("0" & Month(Now), 2) & Right("0" & Day(Now), 2) & Right("0" & Hour(Now), 2) & Right("0" & Minute(Now), 2) & Right("0" & Second(Now), 2)

msgbox(strFileName)

Set objFileInput = objFS.OpenTextFile(strFileName, ForReading)
Set objFileOutput = objFS.CreateTextFile(strFileName & "." & ymdhms & ".csv", True)

Dim aryDestCols(6)
Dim strLine
Dim arySrcCols
Dim strCol

'#### ヘッダは不要
'#### 'ヘッダを書き出す場合はここで。
'#### objFileOutput.Write _
'#### """1カラム目"",""2カラム目"",""3カラム目""" & vbCrLf


Do Until objFileInput.AtEndOfStream
'変換元CSVを1行読み込む
strLine = objFileInput.ReadLine
'項目ごとに分解する
arySrcCols = Split(strLine, ",")

'マッピング通りに入れ替え
aryDestCols(0) = ""
aryDestCols(1) = ""
aryDestCols(2) = arySrcCols(0)
aryDestCols(3) = ""
aryDestCols(4) = arySrcCols(1)
aryDestCols(5) = ""
aryDestCols(6) = ""

objFileOutput.Write Join(aryDestCols, ",") & vbCrLf
Loop

objFileOutput.Close
objFileInput.Close

 

 

pingの記録を残す

バッチ  

ファイル名「000_IPアドレス.bat」
@echo off

set VBS_PATH=%‾dp0
set FILE_NAME=%‾n0
set SHOP=%FILE_NAME:‾0,3%
set IP_ADDRESS=%FILE_NAME:‾4,99%

mkdir %VBS_PATH%%SHOP%
echo cd %VBS_PATH%%SHOP%

title 店舗:%SHOP% IP:%IP_ADDRESS%

:LOOP
set YMD=%date:‾-10,4%%date:‾-5,2%%date:‾-2,2%
cscript %VBS_PATH%output_v3.vbs %IP_ADDRESS% //nologo >> %VBS_PATH%%SHOP%¥%SHOP%_%IP_ADDRESS%_%YMD%.txt

if errorlevel 1 (
echo OK
) else (
echo NG
)

goto :LOOP

exit /b 0

vbs

‘参考:https://blog.engineer-memo.com/2011/03/14/%e8%a4%87%e6%95%b0%e3%81%ae%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%81%ab-ping-%e3%82%92%e9%80%81%e4%bf%a1%e3%81%99%e3%82%8b%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%82%b9%e3%82%af%e3%83%aa%e3%83%97/

dim strIP
dim timeOut
dim strResalt
dim flg

IP_ADDRESS=Wscript.Arguments(0)

'タイムアウト設定(ミリ秒)
timeOut = "20000"

Set objWMIService = GetObject("winmgmts:¥¥.")
Set colItems = objWMIService.ExecQuery _
("Select * from Win32_PingStatus " & _
"Where Timeout = " & timeOut & " AND Address = '" & IP_ADDRESS & "'")

For Each objItem in colItems

WScript.Sleep timeOut

If objItem.StatusCode = 0 Then
strResalt = now & " - " & IP_ADDRESS & " - Reply received. bytes=" & objItem.BufferSize & ": time=" & objItem.ResponseTime & ": TTL=" & objItem.TimeToLive
Wscript.echo strResalt
flg=1
else
strResalt = now & " - " & IP_ADDRESS & " - ##### NG #####"
Wscript.echo strResalt
flg=0
End If

Next

WScript.Quit(flg)

 

 

覚えておくと便利(アクセス)

nullを0に変換して、それ以外は数値に変換する

フィールド名2: IIf ([フィールド名1] Is Null, 0, Val ([フィールド名1]))

 

「#エラー」が出て、「抽出条件でデータ型が一致しません」というエラーが出て困ったら

Val(Nz([フィールド名],0))

 

空欄判定

IIf([CL定期ステータス(コード)] Is Null,"空欄だったら","空欄じゃなかったら")

 

windowsフリーソフト

・Rainlendar Lite

リマインダー機能あり。繰り返しあり。

 公式ページ:

www.rainlendar.net

 

・エフワイメモ Fy Memo

データはプレーンテキストに保存される。Ctrl+Sで保存可能。

 公式ページ:www.guutaras-notebook.com

 

・Schwatch

todo管理に便利だが、表示されなくなるバグがあるので注意。

時報が出せる。

 公式ページ:

sakosoft.g2.xrea.com

 

・みかんリスト

データはプレーンテキストに保存される。

全チェック解除の機能があるので、毎日のルーティンチェックに便利。

テキストの設定ファイルをいじって、色や文字の大きさが変えられる。

 公式ページ:

www.cc9.ne.jp

 

・TTClock

タスクに表示される日時の大きさや形式を変更できる。

 公式ページ:

chihiro718.jpn.org

 

・壁カレ4

カレンダーをクリックしてもスケジュール追加画面が出てこない。

色やフォントも変えられるので使い勝手が良い。

forest.watch.impress.co.jp

 

・Sumatra PDF

毎回開くファイルを設定できるシンプルなPDFリーダー

https://www.sumatrapdfreader.org/free-pdf-reader

覚えておくと便利(エクセル、VBA)

エクセル 50%の確率で1か0をランダムで出してくれる

=MOD(ROUND(RAND()*10+10,0),2)

 

VBAでバッチを動かす(Sylpheedを宛先&件名付きで起動)

'参照設定:Windows Script Hpst Object Model

Sub mail(subject As String)

'コマンドプロンプトを使うためのオブジェクト
Dim wsh As New IWshRuntimeLibrary.WshShell
'コマンド結果を格納する変数
Dim result As WshExec

Dim cmd As String
Dim filedata() As String
Dim i As Integer

m_ddress = Format(Cells(1, 2), "0000") & "@co.jp"
m_subject = subject

'実行したいコマンド
cmd = " ""C:¥Program Files (x86Sylpheed¥sylpheed.exe"" --compose " & m_ddress & "?subject=" & m_subject

Debug.Print cmd

'コマンドを実行
wsh.Run "%ComSpec% /c " & cmd
'コマンドの実行が終わるまで待機
'Do While result.Status = 0
' DoEvents
'Loop

'MsgBox (result.StdOut.ReadAll)

'結果を改行区切りで配列へ格納
'filedata = Split(result.StdOut.ReadAll, vbCrLf)

'A1から順番に結果を書き込む
'For Each filenm In filedata
'Next

Set result = Nothing
Set wsh = Nothing

End Sub

 

エクセル VBA 3列目のセルが変わったら、1行文の色を変える

Sub cellchange(Target)
    With Target
        Select Case .Column
            Case 3:
                Call row_color_change(Target)
                ActiveWorkbook.Save
        End Select
    End With
    

End Sub

Sub row_color_change(Target)
  
  Dim fname As String
  Dim frow As Integer
  Dim i As Integer
  Dim bgcolor As Variant
  Dim txcolor As Variant


'現在のシート名を取得
    'fname = ActiveSheet.Name

'・行数を取得
    frow = Target.Row

'・変わったセルとカテゴリの文字を照合して
    i = 1
    With ThisWorkbook.Worksheets("カテゴリ")
    ctg = .Cells(i, 1)
    Do While ctg <> ""
        '◆カテゴリ名が同じだったら
        If Target = ctg Then
            '背景色を取得
            bgcolor = .Cells(i, 1).Interior.Color
            '文字色を取得
            txcolor = .Cells(i, 1).Font.Color
        End If
        i = i + 1
        ctg = .Cells(i, 1)
    Loop
    End With

    'Worksheets(fname).Activate
    
    '背景色が白だったら、初期化する
    If bgcolor = 16777215 Then
        Range(Cells(frow, 1), Cells(frow, 7)).Interior.ColorIndex = 0
    '白以外だったら行数の背景色を変更する
    Else
        Range(Cells(frow, 1), Cells(frow, 7)).Interior.Color = bgcolor
    End If

    '文字色を変える
    Range(Cells(frow, 1), Cells(frow, 7)).Font.Color = txcolor


End Sub

 

VBA 入力フォーム

[昨日] [今日] [明日]  [ yyyy/m/d(aaa)[▼] [挿入]

┌─────────────────────────┐

│                         │

│                         │

│                         │

│                         │

│                         │

└─────────────────────────┘

[改行]                     [OK]

 

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'フォームを読み込んだら

Private Sub UserForm_Initialize()

 

    'dlist.Value = Format(Now(), "yyyy/m/d(aaa)")

    befor = 7

    For i = 0 To 32 + befor

        dlist.AddItem ""

        dlist.List(i, 0) = ""

        dlist.List(i, 1) = Format(Now() + i - befor, "yyyy/m/d(aaa)")

        

        Select Case Now() + i - befor

            Case Now():

                dlist.List(i, 0) = "今日"

            Case Now() + 7:

                dlist.List(i, 0) = "来週"

            Case Now() - 7:

                dlist.List(i, 0) = "先週"

            Case DateAdd("m", 1, Now()):

                dlist.List(i, 0) = "来月"

        End Select            

    Next i

    dlist.ColumnWidths = 30

    dlist.TextColumn = 2

    dlist.ListIndex = befor

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'昨日を押したら

Private Sub yday_Click()

    InsertText (day_cal(-1) & " ")

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'今日を押したら

Private Sub tday_Click()

    InsertText (day_cal(0) & " ")

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'明日を押したら

Private Sub tmday_Click()

    InsertText (day_cal(1) & " ")

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'日付の計算

Function day_cal(num)

    day_cal = Format(Now() + num, "yyyy/m/d")

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'挿入を押したら

Private Sub CommandButton1_Click()

    InsertText (Format(dlist.Value, "yyyy/m/d") & " ")

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'改行を押したら

Private Sub kaigyo_Click()

    InsertText (vbCrLf)

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'OKを押したら

Private Sub SaveBtn_Click()

    ActiveCell.Value = TextBox

    Call ActibeClear(ActiveCell)

    

    Unload Me

End Sub

 

 

 

 

覚えておくと便利(バッチ編)

REM カレントディレクト

%‾dp0

 

REM 自分自身のファイル名

%‾n0

 

REM ドラッグ&ドロップしたファイルパスを取得

%1

 

REM 文字を切り抜き

REM 例)%tar%=20221201→%y%=2022,%m%=12,%d%=01

set y=%tar:‾0,4%
set m=%tar:‾4,2%
set d=%tar:‾6,2%

 

REM yyyy/mm/dd以降のファイルをコピー

xcopy /S /Y /D:%m%-%d%-%y2% %PATH1% %PATH2%

 

REM 結合

set PATH1=パス1¥*.*
set PATH2=パス2¥ファイル名.csv
type %PATH1% > %PATH2%

 

REM ディレクトリとしてコピー

echo D | /e xcopy パス1¥フォルダ名1 パス2¥フォルダ名2

 

REM ノーメッセージで処理を一時停止する

pause > nul

 

フォルダ内のファイル名やフォルダ名の一覧をテキストに出力

dir /b > list.txt

 

フォルダ内のツリーをテキストに出力

tree /f > tree.txt

 

RM パス1にあるfnameの最新ファイルを探して、PATH2にリネームしてコピーしてくれる

@ECHO off
SET PATH1="パス1¥"
SET fname="ファイル名*.csv"
SET PATH2="パス2¥ファイル名.csv"
for /F "tokens=1* delims=" %%a in ('dir /b /O:D %PATH1%%fname%') do set fname=%%a
copy %PATH1%%fname% %PATH2%

 

ECHO 最新更新日が30日以上前のファイルを移動

set PATH1=C:\AA\AA\AA

set PATH2=C:\BB\BB\BB\BB

forfiles /p %PATH1% /d -30 /m "TEST*.csv" /c "cmd /c move @path %PATH2%"

 


RM 2時間後にシャットダウン

@echo off

echo 2時間後にシャットダウンしますか?
echo ---------------------------------------
echo 実行する場合は「Y」を入力してください
echo ---------------------------------------
echo ※実行しない場合は「Y以外」を入力してください

set /P STR_INPUT="入力:"

IF "%STR_INPUT%" == "y" (
timeout /t 7200
REM timeout /t 1
REM shutdown /s /t 0
shutdown /s /f
) ELSE IF "%STR_INPUT%"=="Y" (

timeout /t 7200
REM timeout /t 1
REM shutdown /s /t 0
shutdown /s /f
) ELSE (
echo 入力:「%STR_INPUT%」:処理中止
echo Enterで再起動せず、この画面を閉じます。
pause
)

 

RM 先月、来月の計算

RM 今年:TYEAR、去年:LYEAR、来年:NYEAR

RM 今月:TMONTH、先月:LMONTH、来月:NMONTH

REM 例)12月

set TYEAR=2022

set TMONTH=12

REM 月は1桁へ

set /a TMONTH = 1%TMONTH% - 100

 

echo ★先月と来月を計算

 

REM ↓ 先月 ↓
set /a LMONTH=%TMONTH%-1

REM マイナスならフラグを立てる
if %LMONTH% leq 0 (

set LFLG=1
) else (
set LFLG=0
)

REM マイナスなら月を計算
if %LFLG% equ 1 (
set /a LMONTH=12+%LMONTH%
) else (
echo マイナスでない

)

REM 月は2桁にする
set LMONTH=0%LMONTH%
set LMONTH=%LMONTH:‾-2,2%

echo 先月:%LMONTH%

REM マイナスなら年を計算
if %LFLG% equ 1 (
set /a LYEAR=%TYEAR%-1

) else (
set LYEAR=%TYEAR%
)
echo 先月の年:%LYEAR%

REM ↑ 先月 ↑

 

REM ↓ 来月 ↓
set /a NMONTH=%TMONTH%+1

 REM 13ならフラグを立てる
if %NMONTH% equ 13 (
set NFLG=1
) else (
set NFLG=0
)

REM 13なら1を代入
if %NFLG% equ 1 (
set /a NMONTH=1
) else (
echo マイナスでない
)

REM 月は2桁にする
set NMONTH=0%NMONTH%
set NMONTH=%NMONTH:‾-2,2%

echo 来月:%NMONTH%

REM 13なら年+1
if %NFLG% equ 1 (
set /a NYEAR=%TYEAR%+1
) else (
set NYEAR=%TYEAR%
)
echo 来月の年:%NYEAR%
REM ↑ 来月 ↑

 

 REM 今月は2桁にする
set TMONTH=0%TMONTH%
set TMONTH=%TMONTH:‾-2,2%