はてなキーワード: VBAとは
高校1年のとき俺は何もしたくなかったが、いつか普通の生活をしなければならないときが来るんだろうなとは思っていた。しかし自分が労働に適正があるとは思えず、しかも就職活動というのはとても辛いことらしい、ということをなんとなく知っていた。ので、とりあえず大学にいくことにした。
何にも興味がなかったので、受験勉強をしなくても良い大学の中で一番就職がよさそうな理系の単科大学(偏差値が低い)に行くことにした。なぜなら就職活動で苦労をしたくなかったからだ。で、行った。
行ったら何か興味が持てるものが見つかるかなとちょっとは思ってたんだけど、特にそういうことはなかった。まじで一つも興味がないまま授業を受けていたので2回留年した。何にも興味がなかったので就職活動もほとんどしなかった。やりたくないことをやりたい感じで話すのがなんとなく苦手だったからだ。あと実家がまあまあ金があったのでまあなんとかなるだろうという気持ちもあった。
卒論を出さないと卒業できないシステムだったので研究室に入ったんだけど、興味がないどころか意味もわからないまま研究的なことをしていた。研究と呼べるのかというと、呼べないと思うが。研究室では水を流し続けるマシンがあって、何を計測しているのかわからない機械で流れる水の何かを計測した。その機械に表示されるなんだかわからない数字を手でプロットし続ける、というのが私の研究であった。
これがまじで面倒くさかった。ただでさえ面倒くさいのに、自分が何をしているのかわからないからだ。小説に出てくるひたすら穴を掘り続ける刑罰のようだった。
この作業には待機時間が結構あった。水を一定時間流す必要があるからだ。その間暇だったので大学に転がっているパソコンで動画を見たりして遊んでいたんだけど、ある日パソコンに入っているエクセルファイルを見つけてなんとなく開いた。
これが素晴らしかった。
数字を紙にプロットするかわりにエクセルファイルに結果を打ち込みボタンを押すと、自動で必要なグラフが表示されるのだ。数字を読んで紙にプロットして線をつなぐ、というめんどくさい作業がエクセルに数字を入力するだけで完結するのだ。しかし表示されるグラフがなんとなく俺が手で書いているそれと違っていた。
違っていて問題があるのかどうか俺には理解できなかったが・・・。なんとなくまずい気がしたので、俺はエクセルにもっとそれっぽいグラフを表示させたくなった。
で、そのエクセルファイルがどうなっているのか調べてみると、どうやら VBA という機能でグラフを生成しているようだった。どうやら俺には多少プログラミングの適正があったようで、VBA のコードを眺めているとそれが何をしているのか多少理解できるようになった。コードには命令がたくさん書いてあって、それが実行されているのだ。
ちょっと調べたら段階的にプログラムを実行し結果を眺めることが出来るとあったので、試してみた。どうやら上から下に向かって書いた命令動いている。上から下に向かって、書いたプログラムが実行されている。
プログラミング、わかるのでは?と思った。
そのままステップ実行を続けると、上から下に向かって進まないことがあることに気づいた。なんか上に戻るタイミングがあるな・・・。なんとなくループの概念を理解した。
このあたりの体験は衝撃的であった。俺は世界や仕事における決定は全体的に誰かの気持ちによってなされると思っていた。なぜなら周りの人間がみんなそうだったからだ。
いつも物事は正しさではなくみんなの気持ちよさによって決定される。俺はそれをいつも気持ち悪いと思っていたが、それは仕方のないことなのだと思っていた。しかしそうではない世界がそこにあった。そこでは正しさだけが正しさなのだ。書いてあるコードが書いてあるコードの通り動く。
このような世界がある、ということは個人的にかなり衝撃的であった。まあ理系大学だから他の授業だって真面目に受けてればそうだったんだろうけど・・・。
そしてプログラミングが自分の仕事になったあと、コンピューターの仕事だって多くの場合みんなの気持ちよさによって物事が決定されるということを知るんだけど・・・。
目的意識もやる気も全然なかったし、授業だって全然真面目に聞いてなかったけど、それはそうとして俺は大学に行ってよかった。というパターンがある、という。
ここにも何回か書き込んだけど、弊社にはエクセルファイルを破壊するMさんがいる。
何をどうしても破壊するので、基本的な入力以外できないようにロックをかけたつもりだったが、Mさんはまた破壊した。
「おかしくなってしまったんです……」とMさんに言われた私は「大丈夫ですよ」と笑顔で答えた。
マクロのボタンを押すと確かにおかしい。ある特定のファイルが開かれる様になっていた。VBAには書き込まれていないので、まさかと思ったらリンクだった。
Mさんはパソコンがとても苦手で、エクセルでどういった動きをしているか先日初めてみたが、本当適当に押したりするのね。
本人に自覚はなくて、セルの結合(しなくていいのに)したいけどどれか覚えられなくて適当に押して、結果こちらが思いもよらないことに…。
それでもMさんはパソコンを覚えたいみたいだけど、別に覚えなくても生きていけるから大丈夫。適材適所と声をかけてあげたい。
多分。また破壊される。
これ、応用情報技術者試験のR4春の午後の問3前半のコードと似ていて読めないようなコードではない。
https://www.ipa.go.jp/shiken/mondai-kaiotu/gmcbt80000009sgk-att/2022r04h_ap_pm_qs.pdf
応用情報のほうは添え字を一次元に展開しているのをChatGPTは二次元でやってるだけ。
問題後半では探索の効率化をやっていて、人間が解くように候補の数字のリストを作成してそこから処理するんだけど、ChatGPTのコードも少しの変更で速くなることはコード読んで短時間で判断できるから決して保守性の悪いコードではないでしょ。
むしろVBAかじった素人や、派遣の自称エンジニアのコードのほうが一般に酷い。
応用情報の方は誘導がありコメントの通り書くだけのラッキー問題で1問あたり30分で設問3つのうちの2つを占めるから制限時間20分だけど、ChatGPTはこれを一行命令で誘導なしで即答する。
一定水準の網羅性を考慮した動作確認用のいくつかの入力と出力の組を過去の業務データから用意して、テスト実行マクロもChatGPTに書かせてしまえば、変更があったときもコードベースで修正しないでプロンプトから出し直してしまえば中身がブラックボックスでもテストで品質確保するテスト駆動開発ができる。レビューなんかテストパターンの網羅性とテスト結果で十分よね。
業務をよく知っている人が業務内容をプロンプトに落とし込んでテストパターンを適切に準備できればVBAの知識はほとんどいらないし、その知識すらChatGPTのコードと会話から学ぶことができるんよね。
https://anond.hatelabo.jp/20230919002911
これに書いてあることは本当。なぜなら自分がその体験をしている。
そしてPythonもSQLもJavaScriptじゃなくて大丈夫。VBAできればもうどの事務職でもやっていける。
ただし田舎。
たまーに増田でも見かけるが、地方では信じられない位アナログな方法でエクセルを使っている会社がある。
弊社ではエクセルファイルAのセルの合計値をコピーして、別の10個のエクセルファイルの決まったセルにコピーする仕事がある。
自分はこれをAにボタンを設置し押すだけで他のファイルにコピーされる様にして、社長含め他の社員に見せた。
途端にビルゲイツ扱いである(社員A(老人)は私をゲイツと呼ぶようになった)。
その結果。ほぼ全ての事務が自分に回ってくるようになった。ゴミ屋敷の様なエクセルファイルをシンプルにまとめるのに2か月かかったが、
これは自分が文系で能力が低い為で、ある程度プログラミングできる人ならもっと早くまとめられているはず。
おかげで仕事中に余裕ができまくりで、会社のSNSも作り、事務とは別に色々やらせてもらえるようになった。
・40歳
・VBAベーシック(35歳の時に取得。つかこれは別になくもていい)
以上。
こんなんでも生きていけるから、あまり後ろ向きにならない方がいいよ。
https://anond.hatelabo.jp/20230917223337
新卒で入ってのアラフォー事務職だけど、そんなポジションやってるわ。
ちょい前は関数とVBAさえできていればよかったのに、WEBもよく使うようになり、最近はoffice scriptばかりになった。
java scriptいけるならと、ついでみたいにKotlinもさせられて業務端末に簡易的なアプリ入れてる。
だんだん高度になってくるといつか惨事にならないかと心配で本職雇ってほしいのだけど、希少性のある今の地位もなかなかよくて困りどころや。
現在、中小企業でアルバイトしているものです。現在の仕事内容経験に対して、待遇は適正でないように感じ辞めたいです。
仕事内容:パワポ作成、請求書データベース管理、VBAでの社内システムのメンテナンス、pc関連の雑用全般。HPの管理。
不登校の子供と小さい子供がいるためもう辞めたいが、自分が不完全な社内システムを作ったせいで(その罪悪感もあり)辞めるに辞められない。自分以外の社員は全員pc知識が全くありません。大変小さい会社です。新しい人間を雇ってくれと言っても人が集まらないと言われました。どうしたら辞められるでしょうか?
ChatGPTに日本語で命令したら秒で作ってくれるのでVBAやGAS書く能力は不要になったんだが。「A1からI9に数独の初期値入れてあるシートの残りのマス埋めるVBAマクロ作って」の一言で数独解くの作ってくれるぞ
ChatGPTが補足している通りロジックは基本しか使っていないので初期値から最終形までに仮定して入れる局面があるものは解けないし非効率ではあるものの初級は解けるし遅いPCでも一瞬で終わる。必要なのは入力の形と欲しい出力を日本語にする能力とHello World実行できるレベルの知識。コード読んでデバッグできる能力があればなおよいがGPTに教えてもらえばいいし、今業務やってる派遣の人に動作確認してもらって不満なところをAIに修正させればよいので業務をよく分かっている社員にやらせたほうが会社としてはいい戦略。
A1からI9に数独の初期値入れてあるシートの残りのマス埋めるVBAマクロ作って
数独を解くためのVBAマクロを作成するのは複雑ですが、以下は一つの例です。このマクロはシートのA1からI9の範囲の数独を解きます。
Function IsPossible(y, x, n, grid) As Boolean Dim i As Integer Dim j As Integer ' 同じ行や列にnが既にあるか確認 For i = 1 To 9 If grid(y, i) = n Or grid(i, x) = n Then IsPossible = False Exit Function End If Next i ' 3x3のボックス内にnが既にあるか確認 Dim x0 As Integer: x0 = ((x - 1) ¥ 3) * 3 Dim y0 As Integer: y0 = ((y - 1) ¥ 3) * 3 For i = 0 To 2 For j = 0 To 2 If grid(y0 + i + 1, x0 + j + 1) = n Then IsPossible = False Exit Function End If Next j Next i IsPossible = True End Function Sub SolveSudoku() Dim grid(1 To 9, 1 To 9) As Integer Dim i As Integer Dim j As Integer ' グリッドをシートから読み込む For i = 1 To 9 For j = 1 To 9 grid(i, j) = Cells(i, j).Value Next j Next i If Solve(grid) Then ' 解をシートに書き出す For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = grid(i, j) Next j Next i Else MsgBox "解けませんでした" End If End Sub Function Solve(ByRef grid) As Boolean Dim i As Integer Dim j As Integer Dim n As Integer For i = 1 To 9 For j = 1 To 9 If grid(i, j) = 0 Then For n = 1 To 9 If IsPossible(i, j, n, grid) Then grid(i, j) = n If Solve(grid) Then Solve = True Exit Function End If grid(i, j) = 0 End If Next n Solve = False Exit Function End If Next j Next i Solve = True End Function
このコードをVBAのモジュールに追加して、シートに数独の初期値を入力してからSolveSudokuマクロを実行すると、マスを埋めることができます。
ただし、このコードは基本的なバックトラック法を使用しており、非常に複雑な数独には効率的ではない場合があります。より高速な解法や最適化を求める場合は、追加の手法やアプローチが必要です。
https://si-coding.net/sudoku4.html
2 3 5 7 8 3 3 4 5 1 6 6 1 2 4 4 9 8 2 2 5 1 3 9 4 6 1 4 1 2 6
1 6 9 2 3 5 8 4 7 4 5 8 1 6 7 9 3 2 3 2 7 9 8 4 5 1 6 5 3 6 7 1 2 4 9 8 7 1 4 3 9 8 6 2 5 9 8 2 5 4 6 1 7 3 6 9 1 8 2 3 7 5 4 2 4 5 6 7 9 3 8 1 8 7 3 4 5 1 2 6 9
Excelはマクロ/VBA/処理自動化なんかを扱った本がたくさん出版されてるので、職場が物理書籍持ち込みOKなら特に悩む必要ないと思う
情報が断片化されたりコンテキストが抜けてたりゴミみたなコピペ記事ばかりなネットの情報より良い場合もある
・マイクロソフトオフィス/ウィルスバスター/エッジ以外のソフトは使用禁止
この条件でマクロ作らんとならん。
こういう時になんか効率的な順序ある?
子供の頃BASIC言語でちょっと遊んだから原理そのものは漠然と分かる。
他人が作ったマクロ開いてコピペで機能追加したり二重で処理してる所見つけて早くしたりぐらいは出来る。
流石はてなーだ。
はてなーも質が落ちたと言うが、こういう分野ならまだまだいい感じやね。
②必要な作業を整理して、それだけを出来るようにメモを作り印刷する。
③記録ボタンを押して、印刷したメモを見ながら作業をし、記録完了する。
⑥ググって一通り解説を見て、求めている解説のタイプを把握する。
⑦本屋やKindleで求めているタイプの解説が載っている本を買う。
⑪持ち込んだ紙を見ながら職場のマクロを改修する(この辺雑誌見ながらBASICのゲーム作るアレじゃねえか。令和に何やろうとしてんだろ俺)。
⑫改修版のマクロを動かしてみる。
⑬不満点やバグを洗い出して家に帰ってまた調べる。
⑭満足するまで⑫と⑬をループ。
って感じかあ。
うんこれで良さそうね。
あとは中古のPC買うかWEBのOfficeで代用できるか最新の365でもある程度再現出来るのか調べてみて家でPTSDサイクル作れるようにしたらモアベターかね。
職場(ネット環境なし)でトライ&エラーはしたいから逆引き辞典みたいのはやっぱ欲しい気はするが。
でもウチの職場でVBA本読むのも自分のスマホで調べ物するのも周囲からの白い目はあんま変わらなそうな気がするんよね……。
職場辞めろについてはマジでその通りなんだけど、今の「Excelでマクロを作るだって?そんなの出来るわけねえぜ!俺たち方眼紙魔術師がマクロに手を出したら神罰が下るぞ?」なしょっぼーい環境に慣れちゃってるから他所で上手くやれる自信がないのよね。
じゃあこの会社潰れたらどうすんのって話ではあるんだけどねえ。
どうするんだろうね。
こんな使えないオッチャンになっちゃってねえ。
アハハ(ちいかわっぽい感じで
https://chat.openai.com/share/c80d83ea-752b-4561-a162-7ea0bd116d56
Option Explicit
Dim objExcel, objWorkbook, objWorksheet
Dim strFolderPath, strSourceFile, strTargetFile, strSearchString, strReplaceString
Dim intLastRow, intRow, intColumn
Set objExcel = CreateObject("Excel.Application")
strFolderPath = ".\" ' スクリプトと同じフォルダにあることを仮定
strSourceFile = "変更一覧.xlsx"
strTargetFile = "変更一覧.xlsx"
Set objWorkbook = objExcel.Workbooks.Open(strFolderPath & strSourceFile)
objWorkbook.Sheets("1月").Copy , objWorkbook.Sheets("1月").Index
objWorkbook.Sheets("1月 (2)").Name = "2月"
' セルの値の置換
Set objWorksheet = objWorkbook.Sheets("2月")
objWorksheet.Cells(1, 1).Value = Replace(objWorksheet.Cells(1, 1).Value, "1月", "2月")
objWorksheet.Cells(2, 7).Value = Replace(objWorksheet.Cells(2, 7).Value, "2023/2/14", "2023/3/14")
' 最終行の取得
intLastRow = objWorksheet.Cells(objWorksheet.Rows.Count, 1).End(-4162).Row ' xlUp
' 値のクリア
For intRow = 8 To intLastRow
For intColumn = 1 To 6
objWorksheet.Cells(intRow, intColumn).ClearContents
Dim objFSO, objTextFile, strContents, arrLines, arrFields, strNewContents
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile(strFolderPath & "変更一覧.txt", 1)
strContents = objTextFile.ReadAll
objTextFile.Close
arrLines = Split(strContents, vbNewLine)
For Each strContents In arrLines
arrFields = Split(strContents, ",")
For Each strContents In arrFields
If IsNumeric(strContents) Then
strNewContents = strNewContents & "'" & strContents & ","
Else
strNewContents = strNewContents & strContents & ","
End If
strNewContents = Left(strNewContents, Len(strNewContents) - 1) & vbNewLine
' データをシートに貼り付け
Set objWorksheet = objWorkbook.Sheets("2月")
objWorksheet.Cells(1, 8).Value = strNewContents
' セルの値の置換
objWorksheet.Cells(123, 1).Value = Replace(objWorksheet.Cells(123, 1).Value, "F", "FH")
objWorkbook.Save
objWorkbook.Close
objExcel.Quit