◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:Excel VBA 質問スレ Part68 YouTube動画>5本 ニコニコ動画>1本 ->画像>8枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1598756127/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付ける
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part67
http://2chb.net/r/tech/1593104489/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
以下の特徴を持つ書き込みは無視するか罵倒されます。 ・「教えて」「助けて」で始まる質問者の頭が悪いことが容易にわかる質問 ・自分で考えるともせず全部作ってもらおうとする厚かましい質問 ・VBA、マクロに関係ないExcelの質問 ・自分のために利用するだけ利用してやろうと、後出しで条件を付け加える人
Testフォルダの中に複数のテキストファイルがあり、それぞれのテキストファイルの中身を1つのエクセルシートに取り込みたいのですが、うまくいきません。 test()をfunc()の中で使えないか考えています。 Sub fun() Dim fso, file, files Dim folderPath As String: folderPath = "G:\Test\" Set fso = CreateObject("Scripting.FileSystemObject") Set files = fso.GetFolder(folderPath).files For Each file In files Dim wb As Workbook 'Set wb = Workbooks.Open(file) Dim ts As Object Set ts = fso.OpenTextFile(file, ForReading) 'Call wb.Close(SaveChanges:=False) Next file End Sub
Sub test() Dim folderPath As String: folderPath = "G:\Test\" Dim textLine, fileName As String Dim fileToOpen As Integer Dim i As Integer fileName = folderPath & "01.txt" fileToOpen = FreeFile() Open fileName For Input As fileToOpen i = 1 While Not EOF(fileToOpen) Line Input #fileToOpen, textLine Cells(1, i).Value = textLine i = i + 1 Wend End Sub
すみません。何とか事故解決しました。 もしこう書けばより良いとアドバイス頂けたら幸いです。 Sub fun() Dim fso, file, files Dim folderPath As String: folderPath = "G:\Test\" Set fso = CreateObject("Scripting.FileSystemObject") Set files = fso.GetFolder(folderPath).files Dim j As Integer For Each file In files Dim wb As Workbook 'Set wb = Workbooks.Open(file) Dim ts As Object Set ts = fso.OpenTextFile(file) Dim i As Integer: i = 1 j = j + 1 Do Until ts.AtEndOfStream Cells(j, i).Value = ts.ReadLine i = i + 1 Loop ts.Close 'Call wb.Close(SaveChanges:=False) Next file End Sub
入門レベルで横槍入れるようで申し訳ないのですが forループ以前とループ内でのDim〜は何が違いますか?
>>8 違いは見やすさだけ
機能はどこに書いても同じ
マイクロソフトは最初にまとめて書けと言ってる
>>7 宣言と初期化を一度に書きたくなる気持ちはわかるけど、マルチステートメントはやめた方がいい
誰に言われるまでもなく上に全部まとめて宣言しているわ 違うプロシージャにそのままコピペで流用して使わないのは消すだけ
>>7 Cellsの前にはワークシート名書いといた方が絶対にいいよ
CodeNameでいいから前に書いときな
B列に"2020/8/1"のように日付が入っていて B列に"発行日"&和暦を入力したいのですが、年・月・日がそれぞれ1桁の場合は頭に0が入ってしまします。 1桁の場合は、0の代わりに半角スペースにしたいのですがどう書けばいいですか Dim r As Long For r = 1 To Cells(Rows.Count,1).End(xlUp).Row Cells(r,2).Value = Format(CDate(Cells(r,1)), "ggge年m月d日") Next r
>>13 For r = 1 To Cells(Rows.Count, 1).End(xlUp).Row Cells(r, 2).Value = Replace(Replace(Format(CDate(Cells(r, 1)), "ggge年mm月dd日"), "年0", "年 "), "月0", "月 ") Next r vba実行時 実行時エラー2147467259(80004005)エラーを特定できません が出ます。 半月前は出ませんでした。 どうすれば良いでしょうか。 具体的に申しますと pdfをテキストにコンバートする関数に 入った直後に出ます。 Dim objAcroApp As New Acrobat.AcroApp Dim id As Long id=objAcroApp.Show←ここで出ます 事情がありスマホで手打ちしました。 見苦しくすみませんがよろしくお願い申し上げます
小計シートのA列に日付があります 1.メニューシートでリストボックスを設置して、そこに小計シートのダブりを省いた日付を入れて選択できるようにしたいです 2.メニューシートの実行ボタンを押すと選択した日付の行全てを結果シートに出力したいです どのような関数を使えば1、2を実現できるのでしょうか?
神経衰弱を作っています Image1~52を並べて全てのImageにクリックされた時の処理を記述しているのですがImageがクリックされた時の処理をひとつにまとめる方法はないでしょうか?
>>20 1つにまとめて、どこをクリックされたかは座標で特定するとか。
>>20 Imagename = Application.Caller
i = Mid(Imagename, 6)
あとは、Select Caseで割り振る
>>20 マクロ登録に引数を付けるかApplication.Callerを使う
Application.callerよさそうですね 使ってみます ありがとうございました
>>20 一度、VBA コントロール配列 あたりでググってみると良いかもしれない
>>20 クラス作ってWithEventsおすすめ。
神経衰弱を作っています カードを2枚裏返して2枚の数字が同じだった Image1.visible = falseで2枚を非表示にしています ゲーム途中でコマンドボタンを押すと1から13までのランダムな数字の枚数だけ裏面のカードを表にしたいのですが今のコードだと既に非表示になっているカードまで表にする対象になってしまっていて13という数字を引いても5枚しかめくれないみたいな状態になってしまいます どうすれば既に非表示になっているカードは除いて表面にする処理ができるようになるでしょうか? ゲーム開始直後の状態であればちゃんと引いた数字分表面にすることができています
For i = Lbound(arr) to ubound(arr) next i 配列の中 ファイル名*書込文字。 (0)001*abc (1)001*bca (2)001*dca (3)002*fed の様な配列の処理を (0)で001.xlsを開いて文字書き込み (1)開いてあるから文字書き込み (2)同様 (3)001閉じる002開く文字書き込み こんな感じに開いてたら閉じる。違うファイルなら閉じて新たに開くってどうしたら いいですか?
>>30 If Worksheets(シート名).Shapes("Image" & カード番号).Visible = False Then
>>34 それだと非表示にしたカートまで表示される
>>30 表裏の切り替えできてるなら裏かつvisibleだけ処理すりゃいいと思う
>>22 sはこれでエラーが出ませんでしたが
これでテストになっているのか疑問です。。(acrobatを操作しているように見えない
Sub ConvertFile()
Dim objAcroApp
Dim objAcroAVDoc
Dim objAcroPDDoc
Dim id
Dim js
Dim SaveName
id = objAcroApp.Show
id = objAcroAVDoc.Open("PDFへのパス", "")
ちなみに
>>18 のソースを本日数度起動してみたところ
1回だけ動作成功しましたww
プログラム以外のところに原因があるんでしょうか。
sはこれでエラーが出ませんでしたが ↓ vbsは・・・ です。失礼しました。
>>37 カードの非表示状態を管理するなりしないと単純にvisibleだけ見ても意味ないよ
>>33 次のファイルが同一ならそのままで、違うファイルなら閉じて開くの処理の仕方が分かりません。
>>40 visibleプロパティで管理してるんだから問題ないだろ
13回選んで4回裏が出たら17回選べばいいんだよ
>>41 ファイル名保持して、ファイル名が同一ならそのまま、違ったら閉じて開くだけ?isbookopen使うとか?
>>38 CreateObject("AcroExch.App")
CreateObject("AcroExch.PDDoc")
しなきゃダメなんじゃ・・。
そういう問題ではない?
あと、1回だけ成功したのなら、 馬鹿馬鹿しいと思うかも知れないけど、 DoeventsかSleepを入れてみるとか。
csvをある列でフィルタし 結果を別のブックに貼り付け csvとして保存したところ 日付+時刻(ゼロ時)の列すべて 5桁の数字になります どうしたら日付+時刻のままで いてくれますか
一定間隔でマクロ実行する方法はなんとなくわかるのですが、不規則な間隔(5秒〜90秒)でマクロ実行したいのですが どんなやり方がありますか?
>>46 日付が5桁の数字って、44078とかだろうけど、
多分フィルタもCSVも関係ない。
値貼り付けしちゃってる。
>>50 Rnd使うのが一般的なんだろうけど、アホな方法を挙げると、
誰かが作った不規則をパク
ってくるとか。 例えばライブカメラの画像をDLして使うとか。
>>50 マクロの最後にApplication.OnTimeを書く
現在時刻に乱数で秒数を足す
モジュール1で定義した配列をモジュール2で使うにはどうすればいいですか? モジュール1でdimではなくpublicで宣言すればいいのでしょうか?
>>51 すべてご推察のとおりです。ありがとうございます。
xlPasteValuesで張り付けてます。
xlPasteAllだと年が月日の後になってしまいます(5/31/2020 0:00)
>>47 さんのおっしゃる
「文字列として」貼り付ける設定を発見できません。
""で囲めば文字列として貼り付けられるのでしょうか。
A1に3、B1に100といれ、実行すると、 3から100行までを非表示にするマクロお願いします
基本技術の試験勉強してるのですが、
https://www.fe-siken.com/kakomon/30_aki/pm13.html この過去問の設問3のマクロの文章の和訳というか、各行がどんな処理をしているのか日本語で説明できる方いませんか
あと、変数iなんですが、なぜiなんでしょう
よろしくお願いいたします
ループカウンタ用の変数名はとりあえずiにでもしとこうっていう昔からの名残 細かく言うと整数を表すIntegerのi i、j、k〜nまで順によく使われる
>>64 ありがとうございます
特にこだわる深い意味は無いのですね
助かります
何度もレスしてすいません。 問題の文章とVBAのマクロの文章を照らし合わせて回答をみると何となく答えがわかる気がしてきたのですが、 相対(a2,work_line,3) がなぜ来店状況ワークシートのセルd列のことになるのか分かりません。 3列目なのでcだと思ったのですが…
>>66 列番号ではなくA列から相対的に数えて何個右の列かってことだろう
>>66 問題見てもないけど、相対って書いてあるからB列から始めてるんじゃ?
と思ったけどレス見ると3次元配列っぽいしよくわからん
相対(A2,work_line)も同じ考え方だぞ?
vbaに直すとrange("A2").offset(work_line,3)
>>68 >>72 ありがとうございます!!
理解しました!
>>70 すいません
そもそもそれもよく分かってなかったのです。
ちなみに良かったらどういう意味が教えて欲しいです。
聞いてばかりで申し訳ありません。
>>74 相対(a2,行,列)
0の場合は省略可なので
相対(a2,行)とか相対(a2,,列)でもいい
>>78 それはvbaのoffsetの構文であって設問の問題文とは関係ないな
>>62 の質問内容がひどすぎて
誰もくいつかないなw
>>78 ありがとうございます。
とても助かりました。
>>62 Range(Rows(Range("A1").Value), Rows(Range("B1").Value)).Rows.Hidden = True
>>57 値で貼り付けるなら、後から
.NumberFormatLocal = "yyyy/m/d h:mm;@"
>>85 上手く質問できなくて申し訳ありません。
全体的な単語の一つ一つの意味が知りたかったのです。
お手隙ならばで構わないのですが、
https://www.fe-siken.com/kakomon/30_haru/pm02.html この問題の設問3の重みパラメータというのがどう作用して出力Zの値になるのか教えて頂けないでしょうか。
あ、すみません。問題よく読んでませんでした。 これについてはレス直後理解しました。 ごめんなさい( ;ᯅ; )
>>84 これで出来ました
ありがとうありがとうありがとううううううううーー
>>91 内容も読まずに書くなよクズ。SQLのことだろうが。
ここで質問したらダメだったみたいですね 該当スレとかあるのでしょうか
>>88 これをどこで聞けばいいのかもわからなかったらFE受かるの難しいよ…
VBA勉強しはじめて、ようやくOutlook連携とかzip圧縮とかやり始めたんだけど Excelそのものの操作に関する情報と比べて、参考に出来る情報の質も量もガクッと落ちた気がする やっぱ話題のpythonに切替えたほうが悩まずやれるのだろうか
質も量も、っていうのはノンプログラマーの自分が探せる範囲って意味です
目の前に答えが書いてあっても理解できない、答えだと気付けない これが「馬鹿には無理」の意味
何をしたいかによるけど、Windowsの操作の自動化っていう範疇ならPowerShellおすすめ Comオブジェクトも使えるよ
なにがおかしいの?
Sub func()
Dim url As String: url = "
https://e-hentai.org/g/1727798/1fbe77a0a2/" ;
Dim buffer As String: buffer = ""
Dim objLinks As Object
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = False
objIE.navigate (url)
Do While objIE.Busy Or objIE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Call WaitFor(3) ' wait for 3 seconds
objLinks = objIE.document.getElementsByClassName("gdtm").outerHTML
Cells(1, 1).Value = objLinks
objIE.Quit
Set objIE = Nothing
End Sub
Function WaitFor(ByVal second As Integer)
Dim futureTime As Date: futureTime = DateAdd("s", second, Now)
While Now < futureTime
DoEvents
Wend
End Function
>>102 Dim objLinks As String
>>105 データをダウンロードするだけならブラウザを使わずに直接ネットアクセスした方が早くて簡単
色んな方法があるけどXMLHTTPとかWinHttpRequestとか調べてみ
>>106 ありがとうございます
'JavaScriptを実行しFormを送る処理
objIE.Navigate "JavaScript:doAction('/文字列')"
みたいなことしないとアクセスできないサイトのデータが取得したいのですが
他に方法ありますか?
>>107 Form送信は単純なHTTPアクセスで代替できるケースが多いから、これもブラウザを使う必要はない
てか、WEBの構造はVBA関係ないし
エクセル2010です。 上書き保存時にすべてのシートでA1セルを選択するようにしたいのですが、 Ctrl+S時とボタンのクリックイベントで挙動が違うことにハマってます。 1枚目シートにactiveXコントロールのボタンを配置し、VBAの構成は以下です。 1. シートモジュール : ボタンのクリックイベントにThisworkbook.saveだけを書いています。 2. ThisWorkbookモジュール : beforeSaveイベントで3を呼び出し。 3. 標準モジュール : 全シートのA1セルを選択するSubプロシージャ。ForEachでまわすだけ。 Ctrl+Sの際は2→3でうまくいきます。 ボタン押下の場合は、1→2→3と流れてはいるものの、なぜか各シートがactivateされなず、activeSheet.Range("A1").Selectが働きません。 1のクリックイベントから直接3を呼び出すのは、うまく行きます。 何故このような挙動になるのか分からず数日ハマってます。 どなたか、ご教示よろしくお願いします。
>>110 for i= activeworkbook.worksheets.count to 1 step -1
apprication.goto activeworkbook.worksheets(i).range("a1")
next i
activeworkbook.save
スマホ打ちだから綴りミスはあるかも
>>110 For eachで全シート回してるならActivateしなくても、
sh.Range("A1")で行けないか?
>>112 間違えたsh.Range("A1").Selectだわ
>>110 働かないという場合の原因で以下のことを調べてみ
1.実は働いていたがその後に別の動作をしたため働いていないように見える
2.働こうとしたが、なんらかの異常が出て失敗している
3.その処理が実行されていない(on errorやifの条件、イベント発生していないなど)
>>105 漏れは、yahoo のログインとか、
Ruby, Selenium Webdriver で、ブラウザを自動操作してる
単純なダウンロード・スクレイピングなら、RubyのNokogiri。
外部コマンドなら、curl, wget
Application.EnableEvents=Falseしてるとか?
“>-1”&i て書いたときに >-2, >-3... っていうふうに比較値が意図せず負に進むんだけど正の値に足したい場合ってどうすれば良いでしょうか。
>>117 VBAの挙動の問題
-を文字列、1を数値として認識してる
そもそも、-1をダブルクォーテーションで括ってるのは文字列として-1を認識させたい時のみにするのが基本
なので、ダブルクォーテーションを取ってやれば意図通り動くはず
へー、そんな挙動するんだ。知らなかった >-11 >-12 >-13 になると思ってたよ
>>113 activeじゃないシートはselectできないと思うが
>>110 Forの中身が間違ってるとか別のブックを見てるとか
ほんとに選択したいシートが選択されてるか確認した?
>>118 クォーテーション外してやってみたけど上手くいかないです...
初心者なんで拙いですが、一応自分で書いたものをのせます。
既出のデータを整理して2次元チャートを作成する目的です。
Dim cnt As Integer
Dim x As Long
Dim y As Long
x = 0
y = 0
For x = 0 To 10
For y = 0 To 10
cnt = WorksheetFunction.CountIfs(Range("B2", Range("B2").End(xlDown)) "<=" 0 + x, Range("B2", Range("B2").End(xlDown)) ">= -1" & x, Range("C2", Range("C2").End(xlDown)) "<= 0" & y, Range("C2", Range("C2").End(xlDown)) ">= -1" & y)
Cells(x , y) = cnt
Next y
Next x
いつも人任せだな… そのcountifの引数の中身が自分の意図した内容かなんで確認しないの?
もう30過ぎて勉強もなぁ…って手が進まない VBAを知識をパンパンに詰め込んでああこれねって感じでカタカタと打ち込んでプロシージャ作りたいもんだわ
考えることを人に丸投げしてるだけで勉強は関係がない
人に丸投げというかネットで拾ったものの組み合わせでいつも何とかしてしまう 知識がほとんど入らない 異動希望出してるしなぁ
エクセルの指定列から3列コピーしてその4列目に挿入して貼り付けた後セルに入ってる値を消すコードをRangeじゃなくてCellsでやりたいです。 clmtar=10 10〜13列をコピー 14列目に挿入 14〜17列目のセルの値クリア。
>>127 コピー後の値を消すの?
元通りになるだけだと思うけど
>>126 愚痴る暇があったら入門書かって1ページでもいいから読んでろ
>>129 すんません…なんか職場でおばちゃんがあれも作ってとか調子こいてるだけで
こりゃまた愚痴だわ
これぞ!っていう入門書ありますかね
イチからガチで鍛えてみるかな
>>126 なんとかできてるならそれも実力のうちなのだと思うよ
楽しい、自分ならこうしてみたい、こうしたらどうなるのだろう
とかがないならそこまでだけど
ネットで検索 プロシージャを組み合わせたり簡単なところをイジる 出きたと思ったら会社のメルアドにプロシージャ貼り付けたテキスト送る 会社で組み合わせる UserFormのボタンに割り当て これでごまかしつつやってきた 圧倒的な知識が欲しいなぁと
>>130 それすら他人に頼るようじゃいつまでたっても進まない
今までどおり困ったら初心者ですとか勉強中ですとかで知識ないアピールで人にやらせて突っ込まれたら謎の正当化とどうでもいい言い訳で誤魔化してやっていくんだろうな
ネットで調べてなんとかなってしまう時代のせいだよね 俺は悪くない
そういう人が増えてきたからあんまり教えないようにしてる
>110です。 書き込み後にいろいろググったところ、いくつかのサイトで コードからの保存はbeforeSaveイベントが正常に働かない旨の記載がありました。 今回の事象もこれに当たるのかなと考えています。 そんな訳で、ボタンでの保存はenableEventsをfalseにして別処理にしました。 回答くださった皆様、ありがとうございました。
別にここで聞いても答えなんて返ってこないし期待してないのでご安心を
足し算がわかりませんとか言われても入門書でも読めとしか言えないよな
入門書を紹介すると今度はどこで買えばいいか聞いてくるよ
すみません。ちょっと長くなってしまうのですがTreeViewをいじっているうちに分からない事があったので教えて下さい。 TreeViewの子ノードをD&Dでリストボックスにコピーする動作を作っていたのですが、ドラッグ開始時点のSelectedItemを取得しようとすると1度子ノードをクリックした上でD&Dを行う必要がありました。 その為、既定引数のIPOS,yPOSを使ってHitTestをSelectedItemに代入しようとしました。 しかしそれが上手く動作せず色々調べた結果、 xとyに*15をすると言う記述を見つけ試してみたところ、思い通りの動作を得られました。 しかしながらこの15はなんの15なんだ。他の環境ではこの数値は変わるのか。変わるならば何を元に算出すれば良いのだろうか。 という疑問が浮かびました。 お手数をお掛け致しますがお分かりになる方がいらっしゃいましたらご教授頂けませんでしょうか。
Windows標準のシステム解像度だとピクセルとTwipsの比率が1:15だからってスタックオーバーフローに書いてあった
c言語のdefineに相当する文法は無いですか? constだと違和感がありますので
>>148 助かります
ありがとうございました
という事は使用環境次第では正常に動作しない場合も有り得るって事なのですね。対策を検討してみます。
>>149 どこに違和感があるのかを言わないと案を出せません
>>128 コピー後挿入したら隣に3列追加されてセルの長さもコピーした3列と同じになりますよね?
>>152 幅を一緒にしたいなら最初からそう書けば良かったのに
>>149 あなたが思っているC言語のdefineの使い方は、コンパイラが置換するもので、定数の概念とは少し違いますよ?
列の挿入なんてあちこちに影響するから、やりたがる理由がわからない。
自分の操作と同じ手順を踏みたいだけなんだろうね プログラマではない素人感覚
超初心者なんだけど 配列の中から指定値の近似値の座標を検索するのにいい感じの方法はないでしょうか (以下、以上、完全一致全て含めての近似値)
>>161 for eachで比較対象値と指定値を全て比較して、結果出力してその中でMIN関数使えば
>>161 前もってソートした配列作って二分探索か、
配列の値-指定値の絶対値が最小になる値を探す
指定値と配列値の差分を絶対値にして比較した場合、 指定値が5だとして 配列 差分(ABS) 4 1 7 2 となり、最小の差分は1とわかる 座標を知りたいので指定値(5)-差分(1)=4となり、配列の中から4を検索して座標を調べればいいのかなって思ってたんだけど 絶対値で出てくると5-1か5+1どっちを検索すればいいか不明じゃないですか? そこらへんを解決する方法があれば聞きたいです
ひとつに絞りたいならお前がルールを決めればいい お前に決定権がないなら保護者に聞け
ExcelVBAのフレームワークってないんですか? PHPやJavascriptはまずフレームワーク覚えるもんだと思うのですが VBAだとそういうのが見当たらなくって・・・
見よう見まねで結構大掛かりなマクロを作った 情シスには程遠い事務の部署で 改善賞1万円 うーんもうちょい欲しかった
オフイスを便利に使うためのお手軽言語でフレームワークの勉強とかやってたら非効率な上に大したメリットもない
フレームワークという意味ではVBAそのものがVB6のOffice向けフレームワーク さらに言えばExcel向けに特化したものがExcelVBA 他のOfficeソフトにもそれぞれのVBAがある
>>167 一つに絞りたいというか最も近しい値を知りたいのです
指定値が5のとき、配列が4と7なら4を、3と6なら6の座標を調べたい
1万行は超えるから総なめはちょっと…
>>172 パソコンにとっては「たった」1万行だよ
総舐めが一番簡単だし、開発時間も含めれば一番早い
>>172 は? 質問は4と-4だろ?
もう俺が決めてやるよ
-4にしろ、はい解決
セルを弄くり回すとかじゃなくて配列のまま総舐めするなら1万行ぐらいすぐ終わるでしょう 指定した値aの近似値が欲しいなら If a-x<=Array(i) And a+x>=Array(i) Then とかで引っ掛かる奴を引っ張り出すなりなんなりすりゃあ良い
近似値の範囲が不定で最も近い値を探すって言うならRank関数とかLarge関数とかSmall関数使うのも手
>>168 各オブジェクトに多数のイベントが設定されているでしょ
windowsのプログラミングはイベントドリブンが基本
ブックが開いた、ボタンが押された、マウスが動いたなどのイベントに対するコードを書いていけばアプリケーションが完成する
すみません今宿題でこれやってるんですけど打ち込んでもなにも出ないのですがなぜでしょう
これです
パズルゲームを作ってます。 セルを奇数列から横2マス選択してドラッグさした場合に、移動先が同じ奇数列から始まる場所なら許可。偶数列から始まる場所に移動した場合は不可にして移動をキャンセルさせたいんですがどうしたら出来ますか?良いEVENTってあるんですかね?
>>180 そのまま入力してちゃんと動いたから、問題文には間違いはない
それにしても学校の宿題だとしたらひどすぎるな
先生がこんなに汚いコードしか書けないとか生徒がかわいそう
>>181 コメント行の終わりにシングルクォーテーションが付いているのは初めて見たw
コメントというより、文字列リテラルに見えてくるw
>>190 こんな意図がこんなに読みづらいコード初めて見たわ
教師は必ずしもコード書いてた人じゃないししゃあないんちゃう
>>193 HTMLみたいにコメントが改行で終わるとは限らない言語はまれによくあるけどな
それよりもインデントの汚さと、Cellsのパラメータにx, yを使ってるあたりがめちゃくちゃ気になる
Kirakira1 のコードにそっくりなのが検索で見るかるけど そっちでは変数宣言しているw
これか
https://my-tax-nology.com/excel-vba-animation-rnd-function-cells-glitter >>マクロ(Excel VBA)を使えば、簡単なアニメーションを作ることができます。
>>アニメーションを作っていると楽しいだけでなく、プログラミングのスキルアップに繋がります。
なるほど??
>>200 VBAを教えてるサイトでコメントをシングルクォートで閉じたりカッコを全角で書くやつなんて世界に一人しかいない
本人ならDimやインデントはちゃんと書くはずだし、完全にパクリだな
180ですなんとかできました。ド素人なんで申し訳ない このコードはそんなできのいいものじゃないんですか? 先生凄く威圧的でいつもそんなんもわからんのかみたいな喋り方なんすけど
すまん wsfやhtaでvbs書くとき 'コメント' って書くわ エディタの色付けがjs用だから
>>203 「なんで乱数を整数化するのにRoundを使ってしまったんですか?」って聞いてみて
他の言語でも行コメントで見出し風にするプロはそれなりにいる。 ただ、初心者に教える人間が行コメント構文を、ブロックコメント構文と同じ使い方をするのは、初心者を混乱させるだけで、何のメリットもない。
>>203 なんで変数宣言しないんですか?
なんでx1とかわかりづらい命名するんですか?
なんでx1とかを上書きするようなわかりづらい変数の使い方してるんですか?
インデントの使い方に意図はありますか?
6の意味が説明されないとわからないのは不親切ですね
などなど…色々質問してみたらいいよ
>>203 その先生は、少なくともVBAの知識だけは大したことないことは誰が見てもわかる
ほかの言語のエキスパートでVBAをバカにする人もいるけど、人に教えるんならちゃんとしろと思う
>>199 よく見つけたな
>>205 それもなんか見ると気になるな。コードの順番も変だし、数値の精度やデータ型をわざとヘンテコにしているのかも謎。
>>205 Rndの定義から考えればIntを使うのが自然だけど、まあそこは100%間違いとは言い切れないからなあ
その先生だと6は数値ではなく数字です! マジックナンバーって何と言いそうw
コードのおかしさは、その先生よりコピペ元のサイトの責任だろ
>>212 教える側の立場として教材として使うかどうか判断したんだから元のところに責任はねーだろ
なんか改悪もしてるし
ループの外でウエイトしてたら速すぎてキラキラしないんじゃ…。 紙に書いてある方。
>>200 こいつもかなり怪しいな
i, jを宣言してないし、変数をゼロクリアしてるのも謎
>>216 本業が税理士なのに、詳しくもないことをひけらかすやつだから、税理士としてもいまひとつの癖のあるやつだと思う。
>>146 そいつはバグだと思うよ。
Mougで質問してた人がいて、俺も試したけどTreeViewでのD&Dで座標がバグってる。
で、15ってのはそのバグを何とか実情に合わせたものだと思う。
俺もその時似たようなことやって15っていう数字には覚えがある。
>>221 >>146 です。色々調べた結果、TreeViewのMouseMoveやMouseDownのイベントで渡される座標が他のフォームとは異なりピクセルで渡される事が原因でした。
なのでGetDesktopWindow,GetDC,GetDeviceCapを用いてDPIを取得し、
取得した値で1440(1440twips=1Inch)を割り、
その値をピクセル数に掛ける事でポイントでの換算に成功しました。
標準の設定ですとDPIが96になるそうなので1440/96で15、となるようです。
VB6だとScreen.TwipsPerPixelXってあったんだがなあ VBAだとPointsToScreenPixelsXとかあるなと思ってみてみたけど、これ、つねに72DPIで計算するっぽいな
>>192 それだと1回めの選択範囲で動いて、移動したら動きますよね?
1回目の行や列を記憶させて2回目で比較する感じですか?
>>222 >>223 うん、その辺みんな知ってるけどTreeViewの問題って違ってたと思うんだが。
動的配列に値を追加していきたいのですが要素番号を0ではなく1から始める方法はありませんか?
Sub testtttt()
Dim arr() As Variant
ReDim arr(1 To 1)
arr(1) = 10
ReDim Preserve arr(1 To 2)
arr(2) = 20
ReDim Preserve arr(1 To 3)
arr(3) = 30
MsgBox arr(1) & " " & arr(2) & " " & arr(3)
End Sub
ちょっとはぐぐれよな
https://www.relief.jp/docs/excel-vba-shift-array-index-to-1-start.html 『[ VBA ]「Option Base 1」使うなよな!反論は聞かない!』
i++とか+=使えないのマジで不便だな 前置インクリメントもできないし一行でもend ifとかloop書かなきゃいかんしめんどくさくね? この言語もうちょい進化しないの?
1行でEnd If書きたくないならThenの後に半角スペースいれたら改行しないで処理書いてみ ++とかは禿同
あー、VB.Netスレだと思ってた。スマン、死んでくる。
制御構造は、キーワードの選び方がやや独特だけど、基本的なものについては、概ね他の言語と同等のことはできると思う。 どちらかというと、変数の宣言・定義が一緒にできないとか、配列・コレクションの要素参照が角括弧でなく丸括弧だとか、プロシージャ呼び出しの丸括弧の要否とかの方が不便さを感じるかな。まぁ、これらも慣れと言われればそれまでだが。
gotoとラベルでできるっちゃあできるけどcontinueとbreakが欲しい
breakは、一応Exit 〜が概ね対応しているのでは(While〜Wendでは使えないけど)? 脱出するループを明示的に指定するので、breakより便利な場合もごくたまにある。もっとも、二重のForループから抜ける場合などは結局GoToに頼ることになるので中途半端ではあるけど。
俺もたまにラベルでcontinueするけどめちゃくちゃ見栄え悪くて嫌
>>232 >>233 基本、それは使わないな。
読みやすさとか構造の分かり易さ優先。
勿論、時と場合による。
ユーザーフォームの2つリストボックスで選択された値を変数に代入する方法を教えてください ■Module1 Public str As String ■ThisWorkbook Sub tes1() UserForm1.Show vbModeless Range("A1").Value = str End Sub Sub tes2() Range("A2").Value = str End Sub
■UserForm1 Private Sub UserForm_Initialize() Dim r As Long For r = Year(Date) - 1 To Year(Date) + 2 UserForm1.ListBox1.AddItem r & "年" Next r For r = 1 To 12 UserForm1.ListBox2.AddItem r & "月" Next r UserForm1.Show vbModeless End Sub Private Sub OKbtn_Click() str = Replace(UserForm1.ListBox1.Text, "年", "") & "_" & Replace(UserForm1.ListBox2.Text, "月", "") Unload UserForm1 End Sub テストで変数strをA1・A2に入れたいのですが、この方法だとどちらも入りません。
ボタン押してstrに代入するところModule1.strじゃないとダメなんじゃないの
>>248 試しましたがだめでした
追記
ブックを開いたまま、tes1を2回目に実行するとA1には書き込みますが、
ブックを開いて、1回目のtes1実行ではA1には書き込まれないようです。
モードレスだから ボタン押した時にUnload UserForm1する前にModule1.tes2を呼び出さないとだ Sub tes1() UserForm1.Show vbModeless End Sub Sub tes2() Range("A1").Value = str Range("A2").Value = str End Sub
AccessVBAを使用しているのですが、標準モジュールを変数に格納する方法がわかりません。 フォームコントロールの様に変数に入れて扱う方法はありませんでしょうか。
Sub test() MsgBox Me.TextBox1.Value Me.Name="a" Me.Name="Sheet1" End Sub 1回目の実行 OK 2回目の実行 MsgBoxでエラー 3回目の実行 OK 4回目の実行 MsgBoxでエラー なんでやねん!
>>254 F8 でステップ実行してみ、あとエラーの内容くらい書いてもよくね?
>>253 ありがとうございます。
フォームを格納できるなら標準モジュールも出来るのかと思って質問しました。
標準モジュール内に書かれた関数の引数として参照先の標準モジュールを渡したかったのですが、別の方法を考えてみます。
動画ファイル(拡張子 mp4,avi等々)の長さ(時間)をvbaで得ること出来ませんかね。 動画用のプログラムでは出ているから何らか手段はあると思うのだけど。
>>257 拾い物、動くかどうかは知らん
Sub ボタン1_Click()
Dim Shell, Folder
Set Shell = CreateObject("Shell.Application")
Set Folder = Shell.Namespace(Range("A1").Value)
Fil = Dir(Range("a1").Value & "\*.*")
Rows("5:65536").ClearComments
i = 5
Do While Fil <> ""
For j = 0 To 40
Cells(i, j + 1).Value = Folder.GetDetailsOf(Folder.ParseName(Fil), j)
Next
i = i + 1
Fil = Dir()
Loop
Set Folder = Nothing
Set Shell = Nothing
End Sub
手を抜くんじゃない! まじめにヘッダー読み込んで解析しろよ
>>255 今環境ないんだけど、
アプリケーションの定義何とかか、
インデックス何とかか、
オートメーション何とかのどれか。
何か変なものがSetされちゃってるのかと思ったけど、
MeじゃMeしかないよね?
>>260 昔、解析したことがある。
aviとかは割と簡単だね。
すごく初歩的な質問ですみません &演算子で文字列と数字をつないで文字列を作った時に 出来上がった文字列に""を付けなくていいのはなぜなのですか? MsgBox "あいうえお" は""を付ける必要がある MsgBox "A" & hoge は文字列扱いのはずなのに""を付けて MsgBox ""A" & hoge"のようにしなくていいのが解せません
""で囲ったら演算子でも変数でもないただの& hogeという文字列にしかならない
ありがとうございます >""で囲ったら演算子でも変数でもないただの& hogeという文字列にしかならない なるほど確かにです では、&演算子でつなぐと文字列扱いになるという認識が間違っているのでしょうか? それとも文字列扱いにはなるけど上記の理由から外すことになっているという感じでしょうか?
>>267 その場合、
hogeは文字列として認識してください
という命令を出している
つまり
文字列(”A”) と(&) 文字列(hogeという変数に入っている文字列) を繋ぎ合わせて表示してください
というのが”A” & hoge
ダブルクォートには引数の囲むような意味はない 引数を囲む記号は丸括弧になる たとえば X = msgbox("a" & hoge) みたいな書き方になる 返り値をとらない場合は()が省略可能ってだけ
値に型ってのがあるのを理解しよう 表示したいのは、"A"という値と変数hogeの値(を連結したもの)だろ &演算子でつなぐと文字列扱いになるってのは、演算対象を文字列に変換して結合するってこと この場合、hogeの値が文字列以外でも文字列に変換して評価するってことだ 基本を理解したいなら、なんの説明もなく&でつなぐと文字列扱いとかいう教え方するところは避けたほうが良いかな とりあえず動けばいいってならまあすきにすればいいけど
MsgBoxの第1引数は文字列型の値である必要があり、文字列型の値を表す式として典型的なのは、@文字列リテラルか、A文字列型の値が格納されている変数(文字列型変数)の参照。二重引用符は、文字列リテラルの表記方法に過ぎない。 &演算子は、本来、2つの文字列型の値を被演算数とする演算子だが、被演算数が文字列型の値と数値型の値であるような場合等は、適宜数値の方を文字列型の値に自動変換した上で本来の演算を行う……ということかと。重複になるが。
>>267 法則を暗記するからそうなる。
法則の仕組みを覚えるんだ。
同じフォルダにある"〇〇"というCSVを開いて、そのシートの最終行を取得したいのですが 「インデックスが有効範囲にありません」というメッセージでとまります Sub salegrp() Workbooks.Open ThisWorkbook.Path & "\〇〇", ReadOnly:=False MsgBox Sheets("〇〇").Cells(Rows.Count, 1).End(xlUp).Row End Sub 他のブックの最終行を表示する方法を教えてください (A列には最終行まで値が入っています)
csv開いたてからActiveWork ook.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Rowすれば
>>276 必要なのは最終行に入ってるデータの内容?行数を知りたいだけ?
全データをワークシートに入れる必要がなければテキストファイルとして開いた方が早いかも
Workbooks.Openの返り値をとってそれを操作する なおRows.Countも省略せずにシート指定する
>>267 Sub tessstttt()
Dim str1 As String
Dim str2 As String
str1 = "あいうえお"
str2 = "かきくけこ"
MsgBox str1 & str2 '結果「あいうえおかきくけこ」
MsgBox str1 & "かきくけこ" '結果「あいうえおかきくけこ」
MsgBox "あいうえお" & "かきくけこ" '結果「あいうえおかきくけこ」
End Sub
>>279 ↑
VBA続けるつもりならこっちでやれるようにした方が
他のbookやsheet絡むととたんに冗長になるんだよなぁ Range(.Cell(a,b))とか .Cellの前にもブックやシート指定しないとならんし
>>283 むしろ1シートだけしか使わない場合でも、実効中に人がシート変更とかしても大丈夫なようにブック明記した方がいい
ブックとシート明示してworksheetオブジェクトの変数作ってそれ経由でアクセスさせるのが鉄板かね〜
csvの最終行だったらテキスト形式でEOFまで吸い上げてってやった方が動作時間的には良さそうな気がした
CSVの読み込みをしっかりやるならPowerQuery使おうみたいな話もあったりなかったり
>>279 俺なんて、必ずBookから書くぜ。
WithとSetを多用することになるが。
>>283 その例ならRangeの前にも"."が必要。
>>286 うん、CSVはLine Inputで1行ずつ+Splitで分解にすることが多い。
VBA覚えたての頃はいちいちアクティブシート切り替えてシート指定省いてたけど Sheet1.Cells(a,b)って書く癖は絶対つけといた方が良いって今は思ってる 可読性が段違いだもん 暫く同じシートのセルをいじくりたおすならWithで目立つように囲ってやりゃあ良いし
>>286 項目中に改行含むcsvとかも存在するからなぁ
汎用的なcsvを真面目にパースするとかなり面倒
そしてEXCELは最強のCSVパーサ(笑)
なんつーレベルの高い話だよ 初心者が覚えようと思ってどんなもんかとスレを見たのが大間違いか
この先いつまで初心者を名乗るつもりか知らないがいちいちアピールしない方がいいよ
>>294 可読性以前に怖いんだよな。
アクティブシートが切り替わっちゃったらどうしようって。
実行中の操作とかで。
DoEvents挟まなきゃ絶対切り替わらないってならいいんだけど。
可読性も考慮するならオブジェクト変数に入れたりWithで囲んだり、頻出する構文なら別Functionに飛ばすという手もある めんどくさいけどバグを出すよりはマシ
そもそもオブジェクト指定のないCellsがいつでもActiveSheetを参照すると思うなよ シートモジュールに書いたCellsはそのシートを参照するんだぜ
VBAというよりVBSかもしれませんが いろいろ試したのですが正規表現の(肯|否)定(先|後)読みに対応していないようなのですが認識に相違ありませんか? また、擬似的に(肯|否)定(先|後)読みに対応させたコードを誰か公開していませんか?
>>301 多くのアプリで、正規表現はWindowsに標準で内蔵されてるDLLを使ってる
独自の仕様やバグがあるのは既知だから、それが気に入らない時は別のライブラリを見つけてくるしかない
VBSはスレ違いになるんだろうけどさー 今、仕事でそれで書かれたコード見てるんだよねー VB.NetからVBAに戻るとそのインテリセンスの効かなさに辟易するけど VBSで書かれたものはその比じゃないねー 参照もなーんも効かないところに持ってきて インデントも正しく書いてないし 綺麗にスパゲティーコードになってるの見ると 殺意を覚えるわー まぁVBS自体は同じファイルの中に 複数のクラスが書けたりするところは VBAよりいいのかな?
見てるだけで殺意はないだろ 自分で分かりやすく直していけばいい
C列に"2007/3/26"などのような書式で年月日が入っていますが それをC=年、D列=月、E列=日にしたいのですが ↓だと年が1905,月が1、日が26日のように変換されてしまいます。 Dim r As Long, dt As date For r = 2 To 435 dt = CDate(cells(r,3)) Cells(r, 3) = Year(dt) Cells(r, 4) = Month(dt) Cells(r, 5) = Day(dt) Next r
>>306 最初date型で取ってやれば確か年や月や日を取る関数が有ったと思うよー
じゃあねー
>>302 私が気に入りそうなものはありますか?
肯定先読み肯定後読み以上に高度な機能は求めていないのですが
ていうかそうしてんじゃん 出力先のセルの書式はどうなってるの? コードを見た感じじゃ少なくとも3列目は 日付型みたいだけど
>>306 year、month、dayの引数のdtの中身は2007/3/26ではない
または3、4、5列目の表示形式をそれぞれy、m、dにしてる
>>306 考えなしに書くからセンス皆無なコードだけど3列目の日付が文字列で入ってるならこんなんどうよ
Dim Ary(2 to 435,1 to 3) As Long,r As Long, a As String
For LBound(Ary,1) to UBound(Ary,1)
a = Sheet1.Cells(r,3).Value
Ary(r,0) = Split(a,“/“)(0)
Ary(r,1) = Split(a,“/“)(1)
Ary(r,2) = Split(a,“/“)(2)
Next
Range(Sheet1.Cells(2,3),Sheet1.Сells(435,5)) = Ary
>>306 Sub Macro1() Range("C2:C435").Copy Range("D2:E435").Select ActiveSheet.Paste Range("C2:C435").NumberFormatLocal = "yyyy" Range("D2:D435").NumberFormatLocal = "m" Range("E2:E435").NumberFormatLocal = "d" End Sub >>306 セルに表示されている文字とセルの値は別だって理解が必要
おそらく
C列の表示形式が日付になっているが、そこの値を数値の2007にした
数値の2007は日付にすると1905/6/29 その年だけが表示されている
同様に数値の3は1900/1/3、数値の26は1900/1/26
まあ、想定とは違うかもしれんが正しく動いてると思われるな
解決策は、表示したいのは数値なのか日付なのかちゃんと決めて然るべき値と書式を設定しろ
つヵ、C列の値でC列に書き換えるとかしないで 元の値を別の列にもっとけば、VBAなしで関数だけで出来るだろうけど
C,D,E列に表示させたいのは「数値」であるにも関わらず 「日付」の表示形式になっているからおかしくなる C,D,E列の書式設定→表示形式を日付から標準にする こうするとC列は39167のような形で表示されることになるが お構いなしにマクロを動かせば、意図した通りの動きになる でどう?
>>305 理解出来るからこそ腹立たしいこともあるよー
例えばaとbとcってBooleanの変数を定義して
a = b = c とか書いてるやつ
まぁbとc が同じならaにTrueが、
違えばFalseが入るってことを期待して
書いてるなら見づらいけどまだ許せるよ
でもcにbが代入されてそのままaにbが
代入されるとか思って書いてたらしく
システムバグらせてそのままにしてたりとか
テストどうしてたんだとか思うよねー
正直こんなのに関わりたくないけど
仕事だからやるって感じだねー
あ、逆だった bにcが代入されてaにbが代入されると 思ってたらしいってことね まぁこの4日間は連休だし そうじゃなくてもテレワークだから 気楽に適当にやるつもりだよー
仕事の内容でそのソースを直せってことなら書き直せばいいんじゃねーの そのまま残すと後任者に同じように思われるんだぜ
>>259 遅くなってしまいましてごめん。自分の欲しかった情報がこれで取れる
事ができました。
ありがと!
>>320 その判断は結構難しい。
今動いてるものは、そのままにしておくというのが通常だ。
Accessでレコードセットループで回してる最中にその値でもって別のレコードセット開いたりを7、8回やって10分かけてデータ作ってるプログラムが有るんだけど、コレ、クエリ1つで出来るんじゃね?と思って試しに作ったら一瞬で出来る。
それでも、正式に変更することになるかと言えばならない。
こっちだってその辺は分かってる。
何かの時に、きちんと作り直しましょうという話になるまで置いとくもんで、むしろそんな話にならずにずっ―とそのままというのが殆ど。
>>322 なら
> でもcにbが代入されてそのままaにbが
> 代入されるとか思って書いてたらしく
> システムバグらせてそのままにしてたりとか
> テストどうしてたんだとか思うよねー
とか書くなよ
どうせ盛々で語ってるだけだろw
>>322 重要な変更とは別で、こまかい高速化や最適化として変更するんだよ
それができないなら他人のコードを悪くいってはいけない
そうかーみんなそんな具合に考えてるのかー でも悪いけどその場でチャチャっと直すことはしないよ もちろん上に話を通すのは当然だけど こんなぐちゃぐちゃな行き当たりばったりのコード書いてんだから直すんなら他への影響調査の時間貰う まぁ当たり前だよねー
>>324 本人でもないのに
> でもcにbが代入されてそのままaにbが
> 代入されるとか思って書いてたらしく
> システムバグらせてそのままにしてたりとか
> テストどうしてたんだとか思うよねー
に対して
> 今動いてるものは、そのままにしておくというのが通常だ。
って言うの?
アホの上塗りにしかなってないけど… w
>>319 実際にそういう動きをする言語もあるからな
>>325 それは開発方法とフェーズによる
いつでも好き勝手コード弄れるような環境ばかりではない
まあ、VBAではあまりないだろうけど
>>326 お前の会社のレベルが低いだけだろ
まあそんな会社にしかいられない自分を省みたほうがいいなw
>>329 ふーん
そっちの会社ではそういうの見つけたら
調べないでチャチャっと直しちゃうのかー
よっぽど優秀なんだねー
俺みたいな無能にはとても怖くて出来ないやーw
>>326 お前以外にチャッチャッと直すなんて言ってる奴いないんだけどw
レベルの話は
> こんなぐちゃぐちゃな行き当たりばったりのコード書いてんだから
の部分な
>>325 いや、そうじゃなくて…
そうか、確かにVBAはそれでメシ食ってる奴は少ないから分からんかもしれんな。
ウォーターフォールでやってて、プロジェクトの目的が決まってるのに、いくら高速化しても余計なことすれば怒られるのが当然なんだよ。
それが原因で不具合が出てみろ。
大変なことになるんだから。
確かに、思いつきでどんどん改変してく仕事も結構やったことある。
>>327 開発全般によくある話として言ったまで。
cとかbとかの話に参加したわけじゃない。
動いてるなら、触らないというのはよくあることだ。
>>328 確かに少ないかもね。
考えてみれば俺も今の職場で初めて。
でも他言語じゃよく聞く話だよな。
>>333 話の流れが読めないバカということはよくわかった
どんなに簡単な修正でも、思い込みやミスは誰にでもある うっかりエンバグする可能性があるから、先方から高速化などの要求がない限りは動いてる物を勝手に修正はしないのが基本かなあ
>>332 それは逆だ、今のコードが悪いかのを直したせいで不具合がおきるのは直し方が悪いせい
自分できちんと直す能力もない奴が今のコードが悪いとか語るなよ
というのは言い過ぎなのかもしれんな、直せる自信がないなら直さないでいいんじゃね
俺から見れば細かい変更もできない人が重要な処理を変更する方が不具合が起きるだろって思うが
なんで動いてるものの話になってるのかわからんけど元々の話は > システムバグらせてそのままにしてたりとか > テストどうしてたんだとか思うよねー だから、修正ありきだろ 修正の手順はその組織で違うだろうけど
ここの会話見てると仕事してる時に戻ったみたいでイヤになる
技術的に可能(can)なのと プロジェクトとして可能(may)なのはべつだって言ってるんだが VBA使いを悪く言う気はないが まともなプロジェクトでやってないから理解できないんだろうな
内製なら結構気軽に弄るもんだよ 俺は以前はSIにいて今は自社サービス兼社内SEだから両方の立場がわかるけど、 システムって君のような外の人が思ってるほど重要なものでも神聖なものでもない
だれも技術的に可能かどうかなんて言ってないのに意味不明なことを言い出してて笑う
企業や仕事がどういうものかを理解していない馬鹿ばっかりで草
自分とか周りの数人しか使わないとかならリファクタリングで弄るケースもあるし全社レベルのシステムとかなら影響調査からってケースもあるわな そのプログラムがおかしくなった時の影響度とかも関係するし 要はケースバイケース
>>338 >>339 先のAccessの話なら直せる自信ならある。
というか、ここにいる奴で俺が出来ないんだったら出来る奴はいないと思うぜ。
それぐらい自信ならある。
ただし、まとも奴なら誰でも言うがバグを出さない自信は無い。
ふと、 日本人のできません 韓国人のできます 中国人のできました を信用しちゃダメ って言うのを思い出した… w
>>348 だよな、さすがに自分とか周りの数人しか使わないとかなら
時間見て許可取ってリファクタリングするわ
自分が作ったツールやシステムなら空き時間見て少しづつリファクタリングだな
さすがに全社レベルのシステムで勝手にリファクタリングはないな
そもそも許可取るのが大変
VBAの後継言語がExcelに標準搭載されると知識も勉強時間も無駄になる と考えてしまいVBAの学習が捗らないのですが、どうしたらよいでしょうか
開発する能力と言語の習熟は別と考えた方がいいと思うよ 弘法筆を選ばずって言うし
>>352 そんな風に考えたことは無いなあ。
その時に必要だから覚えるんだよ。
VBAなんて勉強するもんじゃなくて使っていくうちにわかるもんだし
セルの中身が -------------------------- あああ325gsdsが| aaaojgwe | 33333 | | いいksが | bbb93502g | ^^^^^^^ | | | 888っふぁふぁ | aaawopfjw | f−bgんlsgさ | -------------------------| のような感じの際、「あああ325gsdsが」や「aaaojgwe」のように1行づつ取得する方法はあるでしょうか?
セル内の改行コードはCRとLFとCRLFがあるのでどれかに統一して 統一した改行コードでsplitすれば
VBAやっててもオブジェクト指向が全然身につかないんだけどどうしよう
>>358 セル内の改行はLFだよ。
キーボード入力ならの話だけど。
>>359 VBAとは別にオブジェクト志向に親和性のある言語勉強すれば?
それがVBAにも役に立つよ。
>>360 よそからコピペしたりするとLF以外も混じるよ
念のため統一する方が安心
>>359 オブジェクト指向を身につけるためにVBAをやっているのか?
>>361 >>363 フローチャートは書けても
オブジェクト指向というものがあるということがなんとなく判っていても
じゃあオブジェクト指向できっちり設計しようという発想が浮かばないというかまだ怖さがあるんだよね
MVCって言葉もネットサーフィンをして先週巡り合ったくらいの素人だから
とりあえず新たな設計手法を試そうと思っても
何に手をつければいいかわからん
=EVALUATE()を使ったらマクロだよって保存するときに言われた。 見た目関数なのに実はマクロっていうものが他にどんなのがあるか知りたいんだけど、こういうのなんて言うの? 検索ワードが思い付かないんだけど知ってたら教えて。
>>364 いや、VBAはあまりオブジェクト志向とは親和性がないんだよ。
VBAそのものの根幹はオブジェクトそのものを扱うし親和性も有るんだけど、それで何かを作る時には俺はあまりオブジェクト志向で作らないな。
それでも、感覚的にピッタリ来るときもある。
そういう感覚の為にも他言語の経験が役に立つ。
でも、VBAでオブジェクト志向って上級者じゃないとピッタリ来ないんじゃないかな。
そもそもVBAが古いMS-BASICの言語仕様をほとんどそのまま踏襲してるもんだからオブジェクト指向との親和性はあんまり高くない まだVB.netの方が色々やりやすい
>>369 セルをアクティブにするとCRでも改行するらしいよ
自分はそういうよくわからない挙動に振り回されたく無いから変換するよ
LFとCRLFが混在するのは確かめたよ なので片方に寄せてる CRも混ざる可能性はあるのでついでに処理してるよ
>>366 なるほどそうなんですね
別言語で勉強してみます
セル内で改行するとlfが入る テキストファイルとかでcrlfで改行されたものをセルにコピペすればcrlfがそのまま貼り付けられるが、lf部分が改行されるだけでcrは無視される
もともとマック用のソフトウェアだから、改行コードが揃っていないんだ。
今開いてるエクセル3つを左右で3分割させるマクロとかありますか?
あるけど、マクロっていうかWindowsAPIで画面サイズ調整だろうな。 3画面用意する方が楽かも。
Windows.Arrange ArrangeStyle:=xlVertical
>>381 ありがとう
>>383 本当にありがとう
馬鹿すぎる質問して親切に教えてくれて本当に感謝
教えてくれたコードの方を頂きます
3画面揃ったときについでに分割させたら良い動きしてくれました
めちゃくちゃ後付けですみませんが
これを一番右でこいつは真ん中とか
任意の配置は流石に無理ですか?
出来そうなら自分でも何とか調べてみます
こういう馬鹿の特徴は、少し教えるとつけあがって自分で考えることもせずあれもこれもとねだること 少しは頭を使えよ
accdb → 問題なく型指定出来る。 csv → schema.iniで型指定出来る。 自シート → どうすんの? IMEX=1も利いたり効かなかったりで当てにならん。
罫線の所属するセルについて質問です セルの値を条件にして罫線の種類を変えようと考えているのですが、 隣合うセルの境界線はどちらのセルの罫線が優先されて表示されるのでしょうか? よろしくお願いします
後から指定した方だな。 思いっきり拡大すれば、線が2本引いてあるのが見えるのかと思ったが、そんなことはなかった。 ちなみに、ストIIで2人同時に投げ技をかけた場合、どちらが優先されるのかはランダムで50%/50%らしい。
>>390 これ、たしか罫線の種類で、基本ごっつい順に優先順位があったはず
ついでに、セルの書式設定で罫線設定すると、隣のセルの罫線設定も消えたり変わったりする
太いほうだった(Excelばーじょん2016)
印刷境界とかは分けて認識されてるから、なんだかんだ自分のコードを検証したほうがいいな
あ、宣言とかしときながらシート指定するん忘れてやがる
getElementBy飽きたんだけど、RPA的制御じゃなくて、htttp通信を駆使してどうにかする、みたいのない? APIとか使えない古いシステムに対して。
htttp通信がわからんがセキュリティー的に問題起きるんじゃね
htttpは、ハイパー・トンマ・トンチンカン・タコ・( ´,_ゝ`)プッの略かな
>>397 アセンブラやりたいってこと?
というのと同じ話。
InternetExplorer.Applicationじゃ無くてもみんなgetElementBy使う。
こういう便利なものを放棄するならhtmlのソースを自前テキスト処理で頑張るしかないと思うが。
普通はmsxml2.xmlhttpとかでソース取得して、それをDocumentに入れてgetElemetsByだな。
>>397 その辺は自作ライブラリでビブラートに包めばOK
>>401 >
>>397 > その辺は自作ライブラリでビブラートに包めばOK
震わせてどうすんのさ。オブラートだろって釣られた
>>400 マジか!
xmlがどうとか、APIがないとダメなんだと思ってたわ。
ん? それだと、逆に何のためにGUI操作(IE制御)の方法があるの? 初心者用?
>>403 勘違いしてる。
別のAPI使ってるということだ。
で、別のAPIにもgetElemetByが出てくると言ってる。
RPA的制御がなにかよくわからんが getElementしたくなかったら、API利用してxml取得しろみたいな話を言われたんじゃないか それでAPI使えないけどgetElementしない方法ないの?と 取得できるものがhtmlなら、すなおにgetElementしとけ 以上 ちなみにxmlだろうとhtmlだろうとcsvだろうと、それは多くの場合httpで取得してるだろうがな
>>402 オブラートに包んでもおかしくないか
普通ラップするとかカプセル化するとか言うんじゃ・・・
>>404 どれもhttp通信でデータを取得できる共通点があるだけで、目的はそれぞれ違う
IEクラスはブラウザを操作する為のコンポーネントの一部
mshttpクラスはIEがスクリプトでhttp通信をするためのコンポーネントの一部
WinHttpRequestクラスはWindowsがhttp通信をするためのコンポーネントの一部
(コンポーネントっていうのはプログラムの部品として使うのが想定されている小さいプログラムのこと)
それぞれ色んなシステムで使えるようにCOMインターフェースっていう取説のようなものが実装されていて、VBAはそのおかげで間借り出来てるだけ
どれもVBAの為だけに作ったプログラムではない
ちなみにIEクラスの利点として、ブラウザ上でjsが実行されているページにアクセスすることができる点がある
それをVBAでやる意味は何? もっと他に簡単に出来る言語でやれは?
質問させていただきます ユーザーフォームのテキストボックスにフォーカスがあたってる(入力状態)でwindowsのデスクトップがアクティブもしくは他アプリケーションがアクティブを検知することはできますでしょうか? タッチパネルなどでユーザーフォーム外をタッチしてしまった時を検出したいです。 できるのであればご教授願いたい…
Windowオブジェクトにどんなプロパティがあるんだっけ
フォームのdeactivateイベント拾ってテキストボックスのフォーカス状態見て処理するとかどうかな
HTML, XML, CSV などのスクレイピングなら、
Ruby で、Nokogiri, Selenium Webdriver などが簡単
curl, wget でも、ファイルをダウンロードできるし
Rubyで、nokogiri, curl を使った例
require 'nokogiri'
html = `curl
http://www.example.com/ `
doc = Nokogiri::HTML( html )
elements = doc.css( "h1" )
puts elements.first.content #=> Example Domain
外部プロセスの起動、待機、出力の取り込みまで実装してくださいよ
Rubyの自動運転は使いやすかったけど 早々にサポート切られたから印象悪い
>>413 調べて見ましたがそれっぽいものは発見できませんでした…
>>414 >>415 さんのおっしゃる通りブックやユーザーフォームのDeactivateイベントでは機能しませんでした。
VBAでやる意味? VBA以外だとアホな操作が必要だぞ。 1.Excelを閉じる。 2.他言語で実行。 3.csvをExcelで開く。 全くアホらしい。 運用についての考え方がまるで違う。 他言語でやる場合ってのはバッチ処理なのか? それしか無いのか? そういうブツ切りでデータ加工していくというなら寧ろExcelなんぞ使わん。
>>407 jsしたかったらIEするしかないのね。
今時のHPほぼ全滅じゃん。
>>419 WINAPIでポーリング
>>419 そのマルチタスク、マルチウィンドウを否定したい理由は何なの?
>>424 フォームのテキストボックスに機器の計測値が入るようになっており
テキストボックスにフォーカスがあたってない状態で計測値が送られてくると値が取れないのでおじーちゃんたちにも気づくようにフォーカスが離れた時に警告ユーザーフォームを出したいのです。他アプリケーションなどを立ち上げる事も想定されます。
>>422 情報ありがとうございます
画像の通りやってみましたがイルカさんは働いてくれませんでした…
>>425 アホとしか言えんわ
そもそも設計が間違えてる
RPAとか使ったらこんなおぞましいものができたりするのかな? でも普通はExcelぐらいサポートしてるよな。。。
>>425 > フォームのテキストボックスに機器の計測値が入るようになっており
wの前にデータ取得しとるわなw
>テキストボックスにフォーカスがあたってない状態で計測値が送られてくると値が取れない
wそんな業務データを取りこぼすとか意味不明w
>のでおじーちゃんたちにも気づくように
wなんだ?老害か?w
業務用ツール作るのってホント大変よな…… 使いたい人向けに配信するんじゃなくて、使わされる人に使ってもらうツールだからどんなに優しいUIにしても平気で想像を上回るイレギュラーな操作して動かなくなった!ポンコツめ!みたいなクレーム出してくる人もいるし 単純に新しい物を使いたくないからってワザとメチャクチャな操作したりもしてるんだろうけど ツールを要求してくる上の人達は現状の環境で対応出来るようにしたいからExcelのマクロでどうにかしてよ!とか言ってくるし、VBAはなんでも出来る魔法のツールだと思ってるし 長々と愚痴ってスマンな スレチだよな
Windowsの標準のユーザーインターフェイスを意識しないと、使いやすいと思ったものが結局つかいにくくなる。 フォーカスがあたってなくても計測値が取れるように作るという発想が無いのが厳しい。 そんなこと出来ないなら根本から違うユーザーインターフェイスを採用すべき。 こういう処理でユーザーに何かさせる必要は無い筈。
初心者がツール作るように言われたら大変なんだろうな、俺は大変だと思ったことないが
タブレットでバーコードリーダーのキーボード入力モードでも使ってるんだろうなと想像 COMで操作できるライブラぐらい付いているだろうからそれ使えば解決
>>435 まさにおっしゃる通りで作業進捗をバーコードで管理するものを作りました。
次は工程内のチェックシートと計測値などのトレーサビリティです禿げそう
とりあえず計測器具も試用で借りてる段階なのでメーカーにライブラリの事聞いてみます…
罫線で囲われてたり、色塗りされたりするセルをマウスでドラッグ移動した時移動した場所は何もなくるなるのを罫線のみを残す方法ってありませんか? 簡単に言うと罫線で作った表の形式を保持したい。
>>439 テンプレートを隠しシートに保存しておいて、
ボタン押下で書式をコピペしてくるってどう?
>>439 切り貼りじゃなくてコピーアンドペーストした後に元のところの数式と値をクリア(右クリック+N)すればよいのでは
changeイベントで常に罫線引くことしか思いつかん
セルをマウスでドラッグって何だよ? エクセルで将棋でもやるの?
>>425 それExcel VBAでやるものではない。
自分のやりたいようにやりたければ、Windows SDKでの開発をしてください。
>>439 そもそも手順というものを考えた方がいい。
移動する前の情報を移動先には持ってくるが、移動元にはその情報を適用しないのはなぜ?
指定したフォルダ内の全てのCVSファイルを配列に追記していき対のですが、コードを教えてください 配列の0列目(1次元目)にはそれぞれのCSVファイルのファイル名をいれたいです。 Sub Sptyou() Dim FolderPath As String, buf As String, TargetDate As String '■フォルダを指定する With Application.FileDialog(msoFileDialogFolderPicker) If .Show = 0 Then MsgBox "キャンセルされました。" Exit Sub End If FolderPath = .SelectedItems(1) End With '■指定されたフォルダ内の全てのCSVファイルを開いて、そのファイルA列からGH列を配列に入れていく ReDim BiforeArraybar(1, 190) As Variant
つづき buf = Dir(FolderPath & "*.csv") Do While buf <> "" Open buf For Input As #1 'インプットモードでファイルを開く Line Input #1, TargetDate Do Until EOF(1) 'ファイルの終点まで Line Input #1, Tardt '開いたファイルを上から順に読み込んでいき、変数TargetDateに代入していく If Split(TargetDate, ",")(1) = "" Then Exit Do '配列に追記する ReDim Preserve BiforeArray(Ubound(BiforeArray) + 1 To ??, 1 To 190) = Sprit(TargetDate,",") Loop Close #1 buf = Dir() Loop End Sub
ReDim Preserveで操作可能なのは最右端の次元だけだから2次元配列で1次元目に使いたいなら一旦反転させた状態で操作して出力時にWorksheetfunction.transpose使って吐き出す必要があるぞ いまいち最終目的が分からなかったから取り合えず読んでて気になった所だけ
Linux のcat なら、複数のファイルを連結できるけど
>>448 内側のLoop内で Tardt ってのが気になった
>>449 右端にファイル名を入れるにはどうしたらいいですか?
それと、配列のUpperをどう設定したらいいですか?
また馬鹿な質問者か。それともいつもの厚かましい馬鹿か?
右端の次元と右端の列では話の次元が違うけどわざとやってんのかなー? excelなんだからとりあえずシートに格納すればいいと思うんだけどなー 配列に1行づつ追加するよりはやいんじゃね? VBは動的配列無いんだからパフォーマンス出すには頭を使わにゃいかんよ 行数をキーにしたDictionaryもいいかもね
>>453 配列のUpperが何を意味してるのかいまいち分からんがこんな感じで良いんか?
Line Input #1, TargetDate
BeforeArray(0, Ubound(BeforeArray, 2)) = ファイル名
For文[1〜190](BeforeArrayにSplit(TargetDate, ″,″)を放り込む)
ReDim Preserve BeforeArray(0 to 190, Ubound(BeforeArray, 2)+1)
Do Until EOF(1)
Line Input #1, TargetDate
For文[1〜190](BeforeArrayにSplit(TargetDate, ″,″)を放り込む)
ReDim Preserve BeforeArray(0 to 190, Ubound(BeforeArray, 2)+1)
Loop
>>453 こういうことじゃないのか
targetdata = buf & "," & targetdata
>>455 サイドブレーキを使う坂道発進をダサイと感じるようなもので、
どう考えてもシート格納が合理的なのに、無理して配列を使うわけですよ。
CSV の規格では、各要素をクォート文字で囲めば、 各要素中に、列区切り文字も入れられる "a,b", x Ruby などのCSVライブラリを使わず、 自力で、列区切り文字で分割すると、バグるだけ CSVの規格を知らない香具師が、よくやってる
ExcelでCSVをダブルクリックで開いて編集、上書きして事故る人が多いね
>>460 一応あるけど結局Excelで読めないとダメって言うケースが大多数だったりする
http://www.kasai.fm/wiki/rfc4180jp そのRFCって、たくさんあるローカルルールの1つを紹介してるだけだよな 強制力もなさそうだし、現時点ではあんまり意味がなさそう
>>459 マイクロソフトの製品はそれに沿っているものがあるが、クォーテーションがついたり、つかなかったりするのは、人間にとってもタチが悪く、完全に失敗した仕様と結論が出ている。
列区切り文字は、必要なければ省略できる つまり、x も、"x" も同じ。 全ての要素に、付けてもよい ただし、"a,b" みたいに要素内に、 行区切り文字・列区切り文字・クォート文字を含む場合は、省略できない
>>465 修正
>列区切り文字は、必要なければ省略できる
クォート文字は、必要なければ省略できる
まあそもそも多数の実装が出てからそれ集めて決めた仕様だからな
そういやあれ何だろうな。 QueryTableだとセル内改行でずれるのに、 ADOだとずれないとか。
配列を戻す自作関数を呼び出し先Subから複数回実行して、配列を結合したい んだけど、どうすればできますか? redim preserveとUBoundを使うのかも しれないけど、いい感じにまとまったコードが書けない。 例えば、下の関数を、別のSubから2回実行させて、 「Ary(3) ※中身:path1,path2,path1,path2」 の結果を得たいです。 Function TestFunc() Dim testPath(1) testPath(0) = "path1" testPath(1) = "path2" 'return TestFunc = testPath End Function
配列を戻す自作関数を呼び出し先Subから複数回実行して、配列を結合したい んだけど、どうすればできますか? redim preserveとUBoundを使うのかも しれないけど、いい感じにまとまったコードが書けない。 例えば、下の関数を、別のSubから2回実行させて、 「Ary(3) ※中身:path1,path2,path1,path2」 の結果を得たいです。 Function TestFunc() Dim testPath(1) testPath(0) = "path1" testPath(1) = "path2" 'return TestFunc = testPath End Function
>>471 例えとかいい感じとかじゃなくて正確にコードを提示してどの部分をどうしたいのか明確に説明した方がいいよ
VBAからIEを操作して、タグを指定して.valueやselctedで自動化しているのですが、ヤフオクの商品説明だけどうしても値の挿入ができません。 Tabや近い要素をフォーカスしたりクリックし、SendkeyなどでShift +Tabからエンダーなど試していますが、一向に解決できません。 直接でか無くてもカーソルが点滅させれれば、クリップボード経由で貼り付けるような仕様にしようと考えています。
漏れは、Ruby, Selenium Webdriver で、ブラウザを自動操作して、
send_key で、ユーザー名・パスワードを自動入力して、ヤフーにログインしてる
require "selenium-webdriver"
options = Selenium::WebDriver::Chrome::Options.new
options.add_option( :detach, true ) # ブラウザを切り離す
options.add_argument( '--start-maximized' ) # 画面最大
driver = Selenium::WebDriver.for :chrome, options: options
driver.manage.timeouts.implicit_wait = 10 # default timeout
driver.navigate.to "
https://login.yahoo.co.jp/config/login_verify2?.src=ym" ;
element = driver.find_element(:id => "username")
element.send_key "ユーザー名"
driver.find_element(:id => "btnNext").click
element = driver.find_element(:id => "passwd")
element.send_key "パスワード"
driver.find_element(:id => "btnSubmit").click
そもそも、IE なんか動くのか? 漏れは、Chrome
>>475 すみません。
Sub test
Dim i,ary()
For i = 1 to 2
ary = TestFunc ※ary配列の要素の最後に呼び出した配列を追加していきたい
Next
End
配列に配列を追加するのを初心者がつくるなら 追加する2つの配列と結果を格納する配列の計3つを用意して順番に格納すればできないかな?
>>471 redim preserveとUBoundを使うのかも
まあしかし、その処理ほんとに配列でやるのが良いのか検討したほうが良いんだが
VBAコレクション系弱いからなぁ
>>488 押すだけならワンキーだけど、オンラインヘルプはそこからが長い
下記のように特定の文字を削除して、改行をやめて1行文にしたいのですがコードのご教示いただけないでしょうか やんやんつけ棒§ めちゃ美味い ポテトチップス§ めちゃ美味い ↓ やんやんつけ棒めちゃ美味い ポテトチップスめちゃ美味い
まともなテキストエディタ(VSCodeとかサクラエディタとか)で開いて正規表現置換で§¥r¥を空に置換すればよい
>>492 なるほど…めちゃ助かります。ありがとうございます。
申し訳ありません、もう一点 A1:私は実は理学部出身 A2:の元々は地質学者です A3: A4:こうした南鳥島で A5: A6:レアアースの濃集が A7:起こる A8: A9:というのは A10: A11:特徴的な層準に ↓ A1:私は実は理学部出身 の元々は地質学者です A2:こうした南鳥島で A3:レアアースの濃集が 起こる A4:というのは A5:特徴的な層準に 下の行に文字列 → 2行の文章として、改行を入れてExcelの1マスにまとめる 下の行が空白 → 1行の文書なのでそのまま これをなんとかVBAで自動化したいのですが記述を教示願えますでしょうか 面白くない質問ですみません…
>>497 その条件2つそのままコードに直していけるよ
改行がLfなのかCrなのかCrLfなのか知らんが Replace("改行入りの文字列", vbLf, "")
普通に書けばできることを聞く意味が分からん もしかして書けないの? 書けないならやめればいいのに
>>498 >>499 ありがとうございますm(__)m
>>497 VBAに慣れている人なら簡単に自動化というかVBAで組める内容ではある
問題はこの程度の内容を質問するより先に、自力でできるとこまで自分で
やらなかった最初の一歩が間違っているんだと思う
CSVとして保存
VSCode等のまともなエディタで開く
([^¥r]+)¥r¥n([^¥r]+)を”$1¥r¥n$2”に置換
¥r¥n¥r¥nを¥r¥nに置換
Excelにインポート
>>492 同様にワンショットでいいならこんな感じでいけるんじゃね
クレクレ君のより煽ってる奴のがうざいんだけどね VBAだけが人並にできるからこのスレにいつも欠かさず覗きにきてる感じか? いつものお前が邪魔ですよお
>>508 大丈夫スルーしてるから
遠まわしでも構うと同列に
>>507 できないことは問題じゃない
やろうとしないことが問題
たしかにやろうとしないことが問題 てのは御指摘のとおりですね。すみません。 映像制作を生業としてますが普段tipsを聞くのりで聞いてしまいました。
>>512 5chなんて便所の落書きなんだからそれでいいと思う。
ただ、まともな返事を期待して馬鹿を見ても仕方ない場所でもあるけれど。
ただでさえ印象悪いのにどうでもいい言い訳まで付けてさらに印象悪くするよくあるパターン
Dim dw As Date Dim i As Integer Sub test() 'ランダムに並び替える Randomize '乱数を入れる For i = 1 To 200 Cells(i, 2) = Rnd() Next i '乱数で昇順並び替え Range("A1:B200").Sort _ Key1:=Range("B1"), Order1:=xlAscending, _ Header:=xlNo, _ OrderCustom:=1, _ MatchCase:=False, _ Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin '乱数を削除 Range("B1:B200").Clear dw = DateAdd("S", 5, Now) Application.OnTime dw, "test" End Sub
>>515 のdw = DateAdd("S", 5, Now)
Application.OnTime dw, "test"
を入れると、
「実行できません。このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。」
となってしまいます。
「マクロのセキュリティ」は「すべて有効」にしています。
どうすればいいでしょうか
>>516 そのプロシジャを標準モジュールに書く
CellsとかRangeとか、ちゃんとシート指定しといたほうが良いぞ
>>517 できました!
>CellsとかRangeとか、ちゃんとシート指定しといたほうが良いぞ
わかりました
ありがとうございました。
1,1,2,2,3,4,4,4,5,6 を 1-1,1-2,2-1,2-2,3,4-1,4-2,4-3,5,6 に変換したいのですが、どういうコード書けばよいのでしょうか?
連想配列使ってカウントするか(0 to 対象の値のMax)の配列を用意して、Array(対象の値)にカウントするかが1番頭使わなくて済むかな?
かなり前だけどこのスレで教わったアドバイスが今やってることでピンときた タブ増やして進めてくより userformをhideとshowで工程進めてくみたいにしたほうがいいわ ありがとうかなり前に教えてくれた人!
>>519 fori=1 to 要素数(※要素数はカンマで区切られた数)
数字=数字 & “-” & i
next i
みたいな感じで
前の数字と違ったら数字をリセット
(iが1ならこの処理はしない)
要素がひとつなら処理せず次のiに
かなり前の話と言えば 昔Privateで書かれたプロパティを 外部から取得する方法を書いてた人がいたけど あれどうやるんだったっけ
>>523 それ以前にまったく要望を満たしていない
>>519 どうしたいのかもう少し言葉で説明してくれる?
>>519 普通にカウントアップして、1から2に、2から3に上がるときにカウンターリセット。
1つしかなかった時に連番を付けない処理が一手間多くて面倒 データの先読みが必要になる
1個でも複数でも変わらない おかしな考え方してるんだろう
>>528 1.処理速度
2.低コスト
3.低ステップ
4.読みやすさ
優先順位はとりあえずこんな感じで頼むわ
次の数字を見るかどうかの所で配列の最後かどうかも判定する必要があって面倒 シンプルでうまい方法があるんなら言葉じゃなくてコードで答えてくれ
splitでカンマ区切りの配列化 instrで個数確認 かね?
>>534 Uboundで判定して抜ければいいじゃん
Sub Macro1() Dim a(), b() a = Array(1, 1, 2, 2, 3, 4, 4, 4, 5, 6) u = UBound(a) ReDim Preserve a(u + 1) ReDim b(u) a(u + 1) = a(u) + 1 x = a(0) + 1 For i = 0 To u If a(i) - x Then c = 1 Else c = c + 1 End If If c = 1 Then b(i) = a(i) If a(i) = a(i + 1) And u - i Then b(i) = b(i) & "-1" Else b(i) = a(i) & "-" & c End If x = a(i) Next Debug.Print Join(b, ",") End Sub
これよりシンプルにするのは俺には無理だった Sub Macro1() Dim a$(), b() a = Split("1,1,2,2,3,4,4,4,5,6", ",") u = UBound(a) ReDim Preserve a(u + 1) ReDim b(u) a(u + 1) = a(u) + 1 x = a(0) + 1 For i = 0 To u b(i) = a(i) c = c + 1 If a(i) - x Then c = 1 If (c > 1) + (c = 1) * (a(i) = a(i + 1)) * (u - i) Then b(i) = b(i) & "-" & c x = a(i) Next Debug.Print Join(b, ",") End Sub
b(i) = b(i) & "-" & c ↓ b(i) = b(i) & -c
プログラミングのお題スレにも、たまにあるけど、 次の要素を先読みするのは面倒 スタックのpeek みたいに、要素を読み取るだけで、削除しない関数があればよい
Ruby では、 # 一旦、整数の2次元配列にする。[[1, 1], [2, 2], [3], [4, 4, 4], [5], [6]] result_ary = input_ary = "1,1,2,2,3,4,4,4,5,6".split( "," ). chunk_while{ |prev, nxt| prev == nxt }.each_with_object( [ ] ) do |ary, acc| # 蓄積変数は配列 if ary.length == 1 acc.push( ary[ 0 ] ) else ary.each_with_index do |num, idx| acc.push( "#{ num }-#{ idx + 1 }" ) end end end puts result_ary.to_a.join( "," ) # カンマ区切り
>>542 修正
># 一旦、整数の2次元配列にする。[[1, 1], [2, 2], [3], [4, 4, 4], [5], [6]]
一旦、文字列の2次元配列にする
>>542 修正
>result_ary = input_ary = "1,1,2,2,3,4,4,4,5,6".split( "," ).
result_ary = "1,1,2,2,3,4,4,4,5,6".split( "," ).
先読みって考えるから面倒なのでは? 後出しって考えればいいのでは?
てかあの程度の仕様なら自分で書けよって思う あれぐらいで書けないってのは根本的にプログラミングの基礎分かってないでしょ forとifで一度自分で書いてみろと
データベース変換などは、Ruby のEnumerable のメソッドを見て、 シェル芸とか、プログラミングのお題スレの問題を解いた方がよい VBA は可読性が悪すぎて、作っても再利用できない。 OSS で全会社共通で、RubyのEnumerable 相当のメソッドを作って公開するべき! 他言語ではたいてい、Rubyと等価のメソッドを作る
>>555 修正
>データベース変換などは
データ変換などは
>>555 布教活動ご苦労さん
必要になったら勝手にRubyスレに行くから
帰っていいよ
>>555 データ変換てのは基本的な作法さえ知ってればEnumerableメソッド使わなくても特に困ることもないだろう
ただのループ構造をこねくり回してるだけでそのためにメソッドを割り当てるなんてお仕着せもいいところ
Acrobatを使用したプログラムを複数回実行すると初回だけ成功し 2回目以降は 実行時エラー2147467259(80004005) エラーを特定できません となります(idに代入する行でエラー) 終了処理に不備があってacrobatのプロセスが残っているのではと思いましたが 色々なサイトを見ても解決がわからない状態です。 どうすれば治りますか。 プログラムは次のレスを参照ください。
Dim objAcroApp As New Acrobat.AcroApp Dim objAcroAVDoc As New Acrobat.AcroAVDoc Dim objAcroPDDoc As New Acrobat.AcroPDDoc Dim id As Long Dim js As Object Dim SaveName As String id = objAcroApp.Show id = objAcroAVDoc.Open(FilePath, "") Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() Set js = objAcroPDDoc.GetJSObject SaveName = FolderPath & "\" & Replace(FileName, ".pdf", "") '変換のうえテキストファイルとして保存 js.SaveAs SaveName & ".txt", "com.adobe.acrobat.plain-text" 'PDFファイルを変更無しで閉じる id = objAcroAVDoc.Close(1) 'Acrobatアプリケーションを終了する。 id = objAcroApp.Hide id = objAcroApp.Exit Set js = Nothing Set objAcroAVDoc = Nothing Set objAcroApp = Nothing
どこだか忘れたけど、閉じる・解放はこの順番じゃないとダメって書いてあるサイトがあったぞ。
オブジェクト型にNothingを代入しても、参照ポインタが書き換わるだけでメモリが解放されるわけじゃないんで、順序はそれほど重要じゃない
>>560 必ず再現するなら同じ現象が発生する最小のコードを作ってみ
>>561 とりあえずDimでNewするのやめて様子見てみ
どうやって再度、実行できているのか? 仕事ができない人がよく言う説明。
>>560 タスクマネージャーを起動して、プロセスを終了させてから、実行すれば?
アクロバットがすぐに終了しないのは体感でも分かるレベル
おもいついた
>>530 最後にsubstituteでまとめて消せばよくね?
>>561 objAcroAppにCloseメソッドがあってそれを実行していないとかいうオチだったりして
>>572 普通の頭持ってたら
id = objAcroApp.Exit
がそれだと思うだろうに…
「.CloseAllDocs」 ってメソッドもAcrobat.AcroAppにはあるらしいな そしてExitだけじゃプロセスが残ることもあるらしい まあAcrobatの環境ないから検証も何もできんけど、 安全取るならExitしたあとにプロセス監視してkillするしかないんじゃね 途中でエラー落ちしてもプロセスのこっちゃうらしいし ちなみにどうでもいいが個人的にはExitとCloseは、意味的に異なると思う だからExitとCloseが両方あってもおかしくないとは思う でもExitがCloseを包括していても、それはそれでありだとも思う Acrobat.AcroAppの公式ドキュメント見れてないからワイには答えが出せんわ
>>560 です
皆さん本当にありがとうございます。
みなさんのご意見をプログラムに反映した後、
ソースを最小(adobeをオープン・クローズするのみ)
にしてもエラーです・・・(次レス参照)
タスクマネージャには
adobe CEF helper、adobe update serviceがありますが
前者は消しても湧いてきているように見えます。
パソコン再起動してもダメ、日付が変わってもダメです。
しかし、エラーになったあとちょうど24時間経過すると
無事実行できるようになることがわかりました・・・
24時間後の数分前はエラーでしたが
数分後は無事実行できました。
ちょうど24時間で消えるプロセスが存在するんだと思いますが
何かご存知のかた居ましたらご教示ください・・・
ソースを最小にするためところどころコメントアウトしてます Dim objAcroApp As Acrobat.AcroApp Dim objAcroAVDoc As Acrobat.AcroAVDoc ' Dim objAcroPDDoc As Acrobat.AcroPDDoc Dim id As Long ' Dim js As Object ' Dim SaveName As String Set objAcroApp = CreateObject( "AcroExch.App" ) Set objAcroAVDoc = CreateObject( "AcroExch.AVDoc" ) id = objAcroApp.Show id = objAcroAVDoc.Open(FilePath, "") ' Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() ' Set js = objAcroPDDoc.GetJSObject ' SaveName = FolderPath & "\" & Replace(FileName, ".pdf", "") '変換のうえテキストファイルとして保存 ' js.SaveAs SaveName & ".txt", "com.adobe.acrobat.plain-text" 'PDFファイルを変更無しで閉じる id = objAcroAVDoc.Close(1) 'Acrobatアプリケーションを終了する。 id = objAcroApp.CloseAllDocs←どっかのサイトでobjAcroApp.Hideの前に入れてました id = objAcroApp.Hide id = objAcroApp.Exit ' Set js = Nothing Set objAcroAVDoc = Nothing Set objAcroApp = Nothing
起動設定で、プロセスを殺すと、また再起動するアプリがある。 ウィルスチェックなどの、何かをチェックするアプリ 必ず、最低1つは起動しておくタイプのアプリ そういうアプリは使わない方がよい。 何をチェックして、本社に送っているか、怪しい 会社に問い合わせて、再起動を止めるような設定を聞けば?
区分1〜10のデータが記録されたcsvを区分ごとにExcelシート毎(シート名は1〜10)に分割して読み込むvbaがどうしても出来ません… ご教示いただけないでしょうか…
そんな説明でわかるわけがないので、 そこまで頑張って作ったコードとエラーメッセージを提示するのが最低限 そして、自分で何を試行したのかも説明すること
Ruby なら、これで最初の列だけを、出力できる require 'csv' # CSV ファイルを、1行ずつ処理する CSV.foreach( "a.csv" ) do |row| puts row[ 0 ] end
>>581 C#スレで恥を晒したRuby荒らしは帰れよ
簡単かどうかなんてどうでもいい。 200万件のデータをADO+SQLより速く処理できるならRuby使ってやらなくもないが。 どうなんだい? 無理ならイラネ。
もう時代遅れなのはわかってるけど 会社が2019に更新してまだまだ使う気満々なので そして配布が出来ないと困る
>>583 ルビ糞基地外の味方をするつもりはないけど、DBがボトルネックならRubyだろうが何だろうが速さは変わらんよ
俺の解釈だとこんな感じ Sub Macro1(Filename, Fieldname) Set ws = Workbooks.Open(Filename).Sheets(1) Set pvt = ws.PivotTableWizard(1, ws.UsedRange) pvt.PivotFields(Fieldname).Orientation = 1 pvt.PivotFields(Fieldname).Orientation = 4 pvt.ColumnGrand = False For Each r In pvt.DataBodyRange: r.ShowDetail = True: Next End Sub
PDFファイルの件は、マクロの記録でやるとどうなるのか、確認すればいいんじゃないの?
なあそれ、マクロの記録をするとどうなるか確認してから言ってるのか?
こまけぇこたぁ いいんだよ!! /) //) __ `/ 二つ/⌒⌒\ | ニ⊃ (●)(●)\ /\ノ|⌒(_人_)⌒| / > ヽニノ <
まだVBAなんて使ってる人がいてビックリ 懐かしい言語だよね
Excel2000から20年なんて家電製品なら普通ですよ
>>596 今現在Excel入ってりゃ必ず使えるのはVBAだけだから
まあ最近の言語に比べりゃ色々面倒な部分はあるけどちょっとしたツール程度ならなんとかなるぐらいの機能はあるし
A1に"2020/10/22"のように日付が入っています。 その日付が土曜日の場合、その月の何回目の土曜日かを調べるコードを教えてください。
>>596 ここでRuby教を広めようとしても無駄ですよ
>>599 そうそう、それに win32api のほとんどを呼び出すことができるんですよね
FileSystemObjectの参照設定 VBAの中でできないのかな?
エディタの支援が不要ならCreateObjectでええやん
複数のセルに纏めて背景色を付けたい場合についてです 指定のセルは離れているためRangeで範囲選択では済ませられないです Unionを使用するのも手ではありますが動作速度に影響を及ぼすので最終手段としたいです そこで背景色をつけるセルのAddressを取得して一次元配列に格納し .Range(Join(Array, ",")).Interior.CoIor = CLng("&H00FAFAFA″) で着色しようとしたのですが、どうもこの連結方法の場合、連結数が一定数を超えるとエラー停止してしまう様です なので何か別のアプローチはないものかと模索している最中なのですがもしよろしければお知恵をお借りしたいです
自分で思いつかないようなテクニカルなやり方してもあとで読む人が大変だし普通に配列ループでいいじゃん
>>616 一定数を超えるとエラーになるってわかっているんだから一定数を超えないようにすればいいんじゃね
>>619 不特定多数が使用する業務のスケジュール管理をするツールで、描写したスケジュール表を平日、土曜日、日曜祝日の3パターンで着色する必要があるんですけど、業務期間が長いとどうしても超えてしまう場合が発生するんですよね
業務期間に制限を設けるわけにもいかないですし
配列に格納してんだからループで一定数おきに着色ってのも考えたんですけどUnionより遅くなるっぽいんで最適化を諦めてUnionで繋げちゃうかーって思ってはいるんですが、その前にここで聞いてみて何かヒント貰えたらなーと
あまり編集をしないのであれば、条件付き書式で勝手に色がつくようにするとか
>>616 Join(Array, ",") ← こいつがエラー起こすって感じなの?
String 型は最大20億文字数らしいね
あるいは.Rangeが受け付けないのか
一応ググってみるとRangeの引数は255文字までというのが出て来る
これに引っかかってるんじゃねえの
>一次元配列に格納し これでループ回したところで体感できるような速度差は出ないと思うがな むしろRange内の文字列引数処理のほうが時間食われるんじゃないかと Union・・・どんなもんだろねぇ
>>622 なるほど
引数上限の255文字が原因っぽいですね
んー……そうするとやっぱり複数範囲をカンマ区切りでーは上限が発生しちゃいますよねぇ
255件程度ならどんな方法でもさして時間変わらないのでは screenupdating切れば一瞬で終わりそう
数秒が待てないというのはイベント駆動でもさせる気なの?
エクセルでねぇ・・。 実質DirectX頼りだろう。 セル書き換えじゃ60fps出ないし。
ヒントならもらったろうに、あとはどう実装するかは自力で試行錯誤やればいいんじゃね
処理範囲的には .Range(”M11:Q1011,T11:X1011,【中略】,CF11:CJ1011“).Interior.CoIor ぐらいです 全体で1万弱程のステップがあって他ファイルの読込やグラフの生成、データファイルの出力等があり、全体の処理時間が10秒前後なので この処理を軽くした所で焼け石に水なのは分かってはいるんですが、 オブジェクトの操作を極力減らして動作時間を軽減したいなぁと思っています 次の操作箇所を強調する為にRange(″M20,M20″).Selectみたいな操作を使ったので、これの応用で広域処理も行けるかなぁと思ったんですがダメみたいですね お騒がせ致しました お忙しい中ご意見等頂きありがとうございました
>>631 >他ファイルの読込
俺はこいつが異様に遅くて困ってる
100万個ほどのデータをCSVから読ませてるんだけど6世代i5で3分、セレロンだと10分とかかかる
Lineで1行ずつ読んでるせいなんだろうけどQueryだと早いんだろうなあと思いながら面倒で手を付けてなかった
これを機にやってみるかなぁ
実際相当早くなるもんかね?
何をやってるかにもよるがそもそも一度に全部読み込まなきゃいいんじゃね
曜日の色付けなんてWEEKDAY関数と条件付き書式で良くないか? 曜日ごとに文字列記入するところはマクロにしてるけど
>>634 >一度に全部読み込まなきゃ
そうやねぇ・・・
週ごとにデータを集計してんだけどいまんところ一括で読み込ませてる
常時PC立ち上がってる環境だから逐次データ吸い上げていけば一番いいんだけどそうなると小手先の変更じゃなくて大枠に手を加えなきゃなんなくなるのが頭痛いところ
てかこんなのエクセルでやらせんなよって話でもあるんだけどそうはいかない
>>635 それでも良いんですけど、行ごとに工程の開始日と終了日を設定して工程の期間のセルは計画達成率ごとに緑、黄、橙、赤って着色する必要があり、その着色は開始日が平日なら土日祝日は着色しない、開始日が土日祝日なら期間中全てのセルを着色
とかやるんで条件書式でやるのかなり面倒なんですよね
ユーザーには進捗率をスケジュール表に記入させるんですけど今日以降の進捗率は入力があっても認識から外さなければならないって仕様もあったりするんで
毎回全部のデータつくりなおすのか 差分だけやるとか分割するとかしないのね
あるフォルダに複数のエクセルがあります。 シートは必ず一枚。 一番ファイル名が短いエクセルに 他のエクセルのシートをコピーしてまとめたい。 どう書けば楽ですか。
>>640 一番短いファイル名で同じ長さのものが有った時点で破綻
次の方どうぞ〜
Excelファイルのことを単にExcelと呼ぶのも違和感がある。
>>641 同じ長さになることはありません
説明不足ですみません
ファイル名のことなんてあとで考えればよい。 まず手順を考えてください。 ファイル名は重要ではありません。
シート"土曜日の小計"のA2から、祝日と会社の休業日以外の土曜日を書いていくマクロを考えています。 (シートカレンダーのA列に日付、B列にA列の日付が祝日であれば"1"が入力してあり、C列に会社の休業日なら"1"が入力してあります) このマクロだと、「424 オブジェクトが必要です」になります。どう書けば良いですか? Dim a As Long,r As Long a = 2 For r = 1 To 365 If Weekday(DateAdd("d", r, Date)) = 7 And _ Worksheet.Function.VLookup(DateAdd("d", r, Date), Sheets("カレンダー"), 2, False) <> 1 And _ Worksheet.Function.VLookup(DateAdd("d", r, Date), Sheets("カレンダー"), 3, False) <> 1 Then Sheets("土曜日の小計").Cells(a, 1) = DateAdd("d",r,Date) a = a + 1 End If Next bc
>>652 どのワークシートなのか指定がないけど?
オブジェクトの指定も無いし存在しない命令も書いてあるし
>>610 個別的になるが出来る。
Application.VBE.ActiveVBProject.References.AddFromFileを使う。
VBEを弄るからセキュリティがザルだ。
わかってる奴以外は使わないことをお勧めする。
>>652 Sheets("カレンダー")のあとにセル範囲を書けば動くんじゃね
理解しないまま適当にいじって、エラーが出る位置を見直そうともせず修正丸投げか
>>653 どこにSetをつければいいか分かりません
>>652 どうやって指定すればいいですか?
>>660 Worksheet.Function.VLookup(DateAdd("d", r, Date), Sheets("カレンダー").Range("A:C"), 2, False) <> 1
でも同じでした
>>663 基本的なことができてないようなので職場の他の人に頼んだ方が早いだろう
ある変数に、なんでもいいから100文字セットしたい場合って どの関数使えばいいの? str = "*****..."(100文字) と書くのはダサいから嫌です
>>667 WorksheetFunction.Rept("あ" ,100)
>667 です 669-671 おかげさまでできました有難う天才たち
複数行まとめてコメントアウトしたい場合 どう書けばいいですか 一行ずつ'を入れたくないです。
選択されたら行範囲をすべてコメント化/コメント解除はツールバーにある そのバーが非表示だと表示しなければダメだが あと、推奨されるかは分からないけど、 #if 0 then コメント化したい行 #end if とかよくやります
自分で書いておいてなんだけど、#でぃれくてぃぶによるコメントはお勧めしません 知っておいてよいかも、で
>>678 行の末尾に半角スペースとアンダーバーを入れて次の行と繋げてしまうとか?
>>678 数行程度の編集作業で手を抜くってのはどうかな
むしろそのコメント残さないで削除した方がいいんじゃね
一時的に処理を分けるならプロシージャとかで追い出して呼び出し部分をコメントにするとかあるけど
元々スプレットシート使ってて最近vba始めたんだけど エクセルのvbaではスプレットシートで言うとこのsetvaluesみたいなのはないの? 2次配列をシートに貼り付けるみたいなことしたいんだけど
>>687 VBAは2次元配列限定でRangeに代入すればまとめて書き込んだり読み取ったりできる
VBAはなぜか裏技っぽい文法が好きらしい Midステートメントなんて最悪
>>688 何度もすいません
例えばこんな感じでrangeの範囲がわからない場合rangeのとこどうしたらいいの?
dim tmp
tmp = worksheets("sheet1").usedrange
worksheets("sheet2").range()= tmp
ソース間違いです dim tmp tmp = worksheets("sheet1").usedrange.value Worksheets("sheet2").range()= tmp
Wordの2ページ目以降にラベルを追加する方法について教えてください エクセルからWordを呼び出して、ラベルを追加しようとしています 以下のように記載しました Set newDoc wdApp.Documents. Add newDoc.Shapes.AddLabel msoTextOrientationHorizontal, 35, 300, 30, 20 AddLabelの第二引数(300になっているところ)を増やせば2ページ目以降に追加されると思いましたが消えてしまい上手くいきません すみませんがどうすればいいかご教示お願いいたします
>>695 わからない場合です
いちおうuboundとかで出せるのは分かるけど流石にこれだと増長すぎるかなと
worksheets("sheet2").range(cells(1,1),cells(ubound(tmp),ubound(tmp,2))) = tmp
VBAを使うには記述の冗長さは諦めたほうがいい その書き方で大正解だ
VBAの何が終わってるってこう言う書き方に少しも疑問を覚えない老害がいっぱいいるんだよな
疑問に思ったところでどうしようも無く無いか 自分でクラスでも作るとか?
冗長にしたくなければテーブル使うのが1番手っ取り早いかなぁ プロパティの分かりづらさとネット検索結果の貧弱さは仕方ない
最近おもいついたこと ワークシート関数→波紋 VBAマクロ→幽波紋
>>689 裏技っぽいかは知らんがこれ好き
a = b = c
>>679 ありがとうお勧めではないそうですが
教えてくださった方法でコメントアウトできたので
使いますww
代入が式の言語だと、結果 a、b、c が同値になるし、イヤだなぁ…
>>705 [表示]-[ツールバー]-[編集] で表示られるアイコンの左から9番目で選択範囲を一括コメント化、その右のアイコンでコメント解除
それも試してみてください
マクロ実行後、 エクセルファイルを保存しようとすると プライバシーに関する注意 というメッセージが出ます。 出ないよう設定できるようですが セキュリティ的に不安です。 皆さんどのような対処をされてますか いったんエクセルを全部終了するくらいしか 思いつきません
>>710 実行前に他のエクセルを終了するのが
一般的でしょうか
>>704 好きとか嫌いとかじゃなくて
If b = c Then
a = True
Else
a = False
End If
みたいなコード書くなら
a = b = c
ッて書いた方が楽じゃね?
後から見直すときに前者の方が見やすい 書く時に楽かどうかは別にどうでもいいです
インタプリタの時代にif文の構文解析が遅いからって可読性皆無の謎の数式書いてた思い出
>>697 教えてくれてありがとうございます
これが普通なんですね
仕方ないので暫くはこれで大人しく頑張ってみます
何か荒れてたとこに変な質問して申し訳ありませんでした
>>696 冗長とか増長とか言う前にシートを指定せずにcells( )とか使うのはバグの元、せめて
With Worksheets("sheet2")
.Range(.Cells(1, 1), .Cells(UBound(tmp), UBound(tmp, 2))) = tmp
End With
にした方がいい
..でもうひとつ上のwithが使えるとか変な拡張してほしい
>>717 With ThisWorkbook.Worksheets("sheet2")
.Cells(1, 1).Resize(UBound(tmp), UBound(tmp, 2))) = tmp
End With
おれはブックから指定しないと気が済まんな
Sheetオブジェクトにbookから指定したシート格納して扱うことが多いかなー
Withじゃないと他人がつけたSheetやRangeの変数名を把握するの大変じゃない?
>>696 ???
worksheets("sheet2").usedrange.value= tmp
じゃ駄目なのか?
範囲の文字が欲しいなら
worksheets("sheet2").usedrange.address
とかでも駄目?
>>726 sheet1と2じゃUsedRangeの範囲が違うだろ
sheet1の範囲取得しないと
>>727 意味が分かった。
ならアドレスでOK。
アドレス違うなら関数作れ。
入ってる二次元配列がどんなであろうと貼り付け先1セル指定で貼り付く奴。
会社でxlsmファイルを次の担当に引き継ぐことになりました。 microsoft scripting runtimeの設定をそのファイルに施してあります。 次の担当者は自分で設定しなくても普通に使えるんでしょうか。 それとも自分で開発タブを表示するところから設定しないと エラーになってしまうのでしょうか。
やってみたところ
>>738 の印象だったのですが
実際どーなのかなあって思いまして・・
一時期excelでpthon使えるようになるとかあったけどあれどうなったんだ 正直ちょっと期待してたんだけど
僕「複数のブックから値を取得したい時どうしたらいいんだろ」検索 検索結果「全部のブックを開いて取得しましょう。外部参照しましょう。」 僕「こいつら正気かよ…」
ちょっと読むだけなら4macroとか大量データでないならDB接続とか
クラスが便利なのは分かっているんだが、難しくてやる気なくしてたんだけど ユーザー定義型Typeね、アレすげえな バカなオレでもプログラミングしている気分にさせてくれるくらい簡単
おれもクラスを調べてるけど要はオブジェクトを自分で作り出せるというところまでは分かった
>>745 おそらく4macroで使える程度の関数群は外部参照で元ファイル開かなくても参照できる
どんなデータを集計したいかしらんけどただ値を取得したいだけならブック開く必要ないよ(裏では開いてるけど)
一方最近の関数使ってるなら安全のためにブック開いてたほうがいい
DB接続ってのはエクセルファイルにDB接続できないから意味ないだろうね
>>749 db接続できないと思ってるような人はコメントしなければいいのに
>>749 ジェットでインストール可能なイサムすればつながるだろうが!
txtデータをダイアログから開いた時に 元のxlsmにあるテンプレというシートを 毎回そのブック内の右側に添付したいんですが 御教授お願いします。。 毎回txtデータの名前は異なります。 なかなか調べてもわかりません
よくわからんが、単純に If right(filename, 4) = ".txt" Then じゃダメなんかい
>>754 初心者で理解できてなくてすみません
色々サイトを検索はしたのですが
Sub テキストを読み込む() Dim TARGET_TEXT_FILE As String
ChDir "C:\テキストデータフォルダ"
TARGET_TEXT_FILE = Application.GetOpenFilename("テキストファイル,*.txt")
If TARGET_TEXT_FILE = "False" Then Exit Sub Workbooks.OpenText TARGET_TEXT_FILE End Sub
今のところこれでテキスト開いてるだけなんですが
全く変えた方がいいですか?
これで開いた新ブック全てに元々あるテンプレというシートを添付させたいのですが
説明も下手で申し訳ないです
結構片っ端からヒットしたサイト調べてますが答えがあるのかもしれないのですがなかなか知恵が出てこず…どなたかお助け頂ければと
開いた後にこうかな? ThisWorkbook.Worksheets("テンプレ").Copy , Workbooks(Dir(TARGET_TEXT_FILE)).Sheets(1)
>>755 Dim tsh As WorkSheet
Set tsh = ThisWorkBook.Worksheets(″テンプレ″)
としておいて、
テキストファイルをオープンした後に
tsh.copy
ActiveWorkbook.insert
とかなんとかできないかね
>>757 >>758 お二方、本当にありがとうございます。
いまホテルでPCが無い環境になってしまったので
また試させていただきます。
もし上手く動かなくても勉強にさせてもらいます。本当に感謝します。
わざわざこんなとこで聞くよりググったほうが早いからな ただのかまってちゃんだ
>>762 意味もわからずコピペするだけの馬鹿だから無理なのだろ
>>751 >>752 直じゃなくて一旦DB化(一括インポート)しなきゃなんねえの
Jet.OLEDB,ACE.OLEDB,SQL Server,Power Query
外部DBが使えるならなんでもええがな
こいつら通さずエクセルに直にSQL送ったところで何も帰ってこないよ
さらにいうとエクセルファイルにDBアクセス中にエクセルファイル書き換えると整合性が取れなくなる
別物をかましてるんだからエクセル同志でDB接続とは言えんだろ
凄く初歩的な質問ですいません。 VbaでEDGEを操作することは可能ですか? 可能ならIEで使っていたコードは使えるんでしょうか?
>>765 ただの屁理屈だそんなもん
ADOだのMSクエリ前提で話しているに決まってるだろうが
パソコンでテレビを見るには、チューナを外付けしないといけないから、
パソコンでテレビを見られるとは言えない、とか言ってるようなものだぞ。
いつものあいつって、最初はものすごく下手に出ておいて、希望した回答が得られないと態度が豹変するあいつ?
VBAで業務の効率化ってさ そもそもその会社の業務自体に無駄があるってことなんじゃないかと思う
ipodを水槽にいれて泡がでたら無駄な隙間があるとか言う人いたな
ジョブズじゃなかったんだな
そしてウォークマンでもなくてハンディカムのようだ
VIDEO このサイトから
https://www.netlorechase.net/entry/2017/10/24/225700 M言語 M数式言語 M formula language Mathemstics?
3つの整数をA1,B1,C1にいれるとE1に最大公約数を返すプログラムの作り方をforを用いてプログラムを教えてください
>>782 まずVBEを起動するんだfor!
アルゴリズムを調べてコーディングするんだfor!
うまく動くかテストするんだfor!
>>782 最大公約数ってどうやって求めるか学校で習わなかった?
Option Explicit Sub a1tob1toc1nosaidaikouyakusuuwoe1ni() Dim i As Integer For i = 1 To 32766 Range("E1").Value = Application.WorksheetFunction.Gcd(Range("A1"), Range("b1"), Range("c1")) Next End Sub
「最大公約数的に言ってもさあ、チーズはトマトと合わないだろ」
VBAでシフトJISファイルをEBCDICに変換するマクロ作ってみたわ。
http://tamajimu.sytes.net/archives/911 VBScriptのやつはあったけどVBAのがなくて移植しようと思ったら手こずってしまった。
もっといいやり方あるのかな?
ネット上にはVBAのやつがなかったので自分のを公開する。
>>801 wikiに詳しく書いてあるのを読んで目的の動作をしたならそれでいいと思う
昔VBで自作した覚えがあるなぁ VBSの移植で、どこにどう手こずったんだろ .NETのSystem.Text.Encoding使う手はどうだろうと考えたみたが GetEncodingでエンコード取得するのがうまくいかんな 誰かこれうまいことやる方法しってる?
無いと思うな 最悪、CreateObject("WScript.Shell")で逃げられるし
ウインドウ固定をスクロールに応じて動的に変えるにはどうすればいいですか? 例えば、最初は2018年の列が固定されていて、2019年の列までスクロールしたら、2018年の固定を解除して2019年の列を固定するように変えたいです。
>>773 残業代欲しくてわざとチンタラ仕事したり自分にしかわからないようにするのをVBAでどーにかするのは無理だわな。
shapes.count、chartobjects.countで数えても引っ掛からないグラフってどうしたら操作できますか? そのグラフは隣シートを参照して自動的にできるものっぽいんですけど
リストボックスの検索結果をダブルクリックすると該当セルを選択するようなものを実現したいのですが
実行時エラー 13
型が一致しません
とでます
該当箇所は
.Range(.Cells(ListBox1.List(ListBox1.ListIndex, 0) + 1, 1), .Cells(ListBox1.List(ListBox1.ListIndex, 0) + 1, 13)).Select
です
恐らくネットからコピペして来たものなのでセルの選択が間違っているのかと思うのですが、このコードの意味がわかりません…
どう修正すればいいでしょうか
またどこがなんの意味を表しているのか教えてください
全文
https://writening.net/page?C2Jumd なぜ中途半端にあげるかね? いちいちコマンドボタンやらテキストボックスやらデータなんて 作ってられるかっちゅうの
一々ソース見てないけど どうせ標準モジュールでちゃんとどのブック、どのシートと指定していないと決めつけていい?
.Range(.Cells(略),.Cells(略)) ↓ Range(.Cells(略),.Cells(略))
Excel VBAでも証券会社(e立花証券)のAPIを操作できるのでしょうか? ExcelのVBA以外やったことがなくpytonなどからAPIを動かしてる動画などはよく見かけるんですが
JSONって書いてあるから出来るんじゃないかと思ってググったら、 トレードステーションスレとマルチしてるのが見つかったわwwww
ExcelでADOを使ってcsvを取り込む前に、 @csvの1行目を削除 ↓ Acsvの特定の列の1行目(@の前は2行目)の文字を修正 これを自動化するにはどうしたらいいですか? 業務システムから出力されたcsvをExcelに取り込む作業があるのだけど、 1行目に邪魔な出力日時が出てきてこれを消さないとADO+SQLのselect文で2行目のフィールド名を使えません あとフィールド名に一部重複があるので、 例えば「日付」→「日付2」に修正した上で取り込みたいです
データとして読み込む前に、一行目棄てる、フィールド名変える処理したテンポラリファイルを作る。
ああ、俺もそういうカスみたいなCSVに当たったことあるわ。 何のためのCSVだボケって言いたくなるような。 最初に1行だけテキスト読み込みして日付を調べておいて、 SELECT [出力日:2020/11/29] AS 商品コード F2 AS 商品名 F3 AS 単価 F4 AS 数量 WHERE 商品コード <> '商品コード' とか無理矢理やるわwww
フィールド名に重複とかどんな出力したんや。。Excelからくらいだろそんなの
CMやってるような有名なシステムでも、そういうアホな出力あるよ あとカンマ入れるとそのまま出てきて1列ずれるとか
アホかねえ。 別にそんなのどうとでもなるから不満にもならんな。
>>823 できました!
csvの取り込み方を工夫するのではなく、
tmpシートを新たに用意してそこに読み込ませて加工、
今度は今までのコードの接続先をcsvではなくtmpシートに変えてなんとかなりました
>>824 作った業者がアホなのか依頼した会社がアホなのかわかりませんが、
例えば商品コード的なものも正式表記と略号表記があって、
どちらも同じ「商品コード」というフィールド名になってたりします
前々スレくらいで乱数発生教えてくれた人 今でも本当にありがとうと感謝してる 仕事で役立ちすぎて凄いわ ある範囲を元に乱数発生させるがその数値は変化をさせないジレンマのあるようななるほどと思わせる構文ですね と言われたわ
ちょっと前にランダムなデータを提出する謎仕事の質問があったなあ VBA化したら一瞬で終わるようになって事務員がクビになったとか、そんな話
んん?? ランダムなデータを手作業で作るの? かなり偏り出そうな…
データ数が有限だと、それが本物の乱数なのか人工的な物なのか判断する方法は存在しないんだよね どんな数字列でも無限にある乱数列のどこかに存在するってのが本来の乱数の性質だから
無限のデータって何よw あったとして、お前それ仕事で扱うの?www
無限発射編と言っても実際には無限じゃないしな 本当に無限発射すると宇宙がヤバイ
毎日出力される日報の各数値を手打ち入力とかよくあるわな そんな無駄な作業専門で雇われている人、無駄ともおもわず人件費払っている企業 なんて古き良き日本にいくらでもあるわな
夢幻には続かないだろ。 人類がドンナニ存続したところで地球が太陽に飲み込まれたところで終わり。 はい。どこが無限? 無限舐めてんの?
設計書のヘッダー全部オブジェクトにしたやつなんなんだよ 頭わいてんのか
本文と共通ヘッダーの構成があわないからオブジェクトで無理くりヘッダー作ってたりするんだよな うちにもそういうのあるわ
すいません、全くvbaについて無知なのですが、A2セルに入力した数字を、A3セルに=A2にて反映させてます。A2セルに続けて数字を入力した時に、A3セルの数値は、続けて入力した値になると思うのですが、入力した内容を上書きせず、A4.A5.A6...と、下のセルに移動させることは可能ですか?また、その数値も自動的に小さいものから並び替えできるでしょうか?
1回目入力 A3に 2回目入力 とりあえずA4に A3〜A4を並び替え 3回目入力 とりあえずA5に A3〜A5を並び替え って事?
VBAに使用期限つけてパスワードかけて異動するわ 来年のある日から使えなくなる さようなら
>>844 VBAのパスワードなんて簡単に解除できちゃうから意味ないぞ
>>845 いや、知らないですけど、くらいにとぼけようかなと
>>846 そこまでガチガチにやるつもりもなく
プロパティのロックしとく程度の予定
やっぱ悪質かなぁ
上司と遺恨のあるまま異動だから悔しくて
自分で作ったんなら削除して手作業でやるんですよと引き継ぎすれば良いやん
>>843 いや、入力は全てA2セルで固定して行い、A3セルに反映された値を消すことなく(A2に次の入力があれば、A3の値がA4とかに移動すりかして残るように)、連続入力がしたいです。
>>847 その気持ちスゲー分かるわ
だって俺と考えてること一緒だもんw
2020年をマジックナンバーとして仕込む 特定のデータをマジックナンバーry 閏年を考慮しない 自作アドインを前提にする 外部VBAをローカル指定する
会議を管理するデータベースを作成しています テーブル1に日付、開始時間、会議名、条件があり、 条件がTrueの会議名を重複なくテーブル2に転記 その後テーブル1に新たな会議データが登録された場合も、 条件がTrueでテーブル2に該当がなければテーブル2に転記という流れ ↑こんな感じで良い方法ありますでしょうか
>>854 それを作るのがあなたの仕事では?
自力でできないならできる人に頼むしかないと思う
>>849 合ってるやん
1回目(A2に)入力(したのを) A3に
2回目(A2に)入力(したのを) とりあえずA4に
A3〜A4を並び替え
3回目(A2に)入力(したのを) とりあえずA5に
A3〜A5を並び替え
>>858 あってますね。すいません、理解力が足りませんでした。
>>847 転職ならいいけど異動ならその上司が移動先の上司に電話して「なんか動かなくなったから彼1日借りるね」って言われて直させられるだけやん
しかも原因わかったら移動先の上司にチクられるだろうし
全然関わりない遠い部署に行くから 俺が完全に自作したものを皆が使い回してるだけだし無効化してやろうかなと、 そこに行ったら知らないで通して最悪本当に呼び出されたら 下のように感じでコメント入れとけば 最悪、立ち会いでモニタ見られながらやっても 確信犯なのは避けられるかなと… このまま異動はどうも許せんくて 性格悪いのは自覚してる 'マクロを最新で運用するために必須 Private Sub Workbook_Open() Dim today As Date Dim exp_date As Date today = Date '日付制限して確実にメンテナンス 'これは怠らないこと exp_date = "2021/2/20" '書類の改定の確認で定期的にメンテナンス が必要だから一度確実に止めてしっかり確認 If Not today < exp_date Then ThisWorkbook.Close savechanges:=False End If End Sub
好きなようにしてここからも関わりのないどこか遠くへ行ってね。 ずーっと複数人がしてた忠告に耳もかさず我を通した結果であって 最後くらい責任持ってケツ捲くってね
バレたら損害賠償モノだと思うし容易にバレると思うけど
会社の時間を使って作った会社の資産であるのに個人のものと勘違いしてる馬鹿
家で作ったプロシージャをtxtでコピーして会社にメールで送ってハメてただけだから ほとんど個人の時間削ったものだけどね ちょっとやってみるかなあ
application.ontimeメソッドを使ってるのですが、 For i = 0 To Counter Application.ontime StartTime + Interval * i, "renzoku" Next i これを停止させるのが難しそうだったので、 停止はさせないで、エクセルを閉じれば停止すると思ったのですが、 他のエクセルを開いた状態で、これを閉じたら、 またマクロが動き続けてしまいます、 ontimeメソッドを停止させるか、 マクロの書いてあるエクセルを閉じたら、 ほかのエクセルが開いていてもマクロを停止するようにはできないでしょうか?
>>866 タイマーで設定した内容をどこかに覚えておいて、また停止させるマクロを動かす
面倒だけど、それ以外に方法はない
CSVのデータを開いて 全部その中で計算させて結果だけをマクロブックに取り込んでCSVを閉じる 初心者ながら成功した…うれしいわ
ほとんどの解説サイトではcells("A1")と記載されてますが、cells (1,1)の方が分かりやすいし、vbaも組みやすいのに、なぜA1と言う記載なのでしょうか? ここの人たちはどっちを使ってますか?
>>871 range(″A1″)ね
初心者向けにイメージ掴ませやすいような表記をしてるだけでは?
インクリメントとか考えるとcells使う方が確かに分かりやすいけどどういう訳か初心者はcellsを理解してくれない
>>861 何もしないで放置しておけばいいよ
周囲の仕様変更で使い道なくなるだろ
後腐れなく異動しようぜ
VBS使うとウィンドウ非表示で目的のファイルの削除、その後にVBSファイル自身を削除ってのが出来るけど
そんな時限爆弾がスタートアップフォルダに入ってたなんてー(驚愕)
range("A1") と cells(1, 1) なら変わらないけど、k列とか言われるとね 固定された位置なら前者じゃないかしら 式の解析をする分だけ前者が遅い気がするけど
>>872 あ、rangeでした
普段使わないから間違えた
たまにしか使わないからサイト検索しながら組んでるんてすけど、分かりにくいからやめてほしい…
rangeは範囲を選択するときは便利だけど1つのセルならcellsだね まあ範囲も動的ならrangeの中にcells使うけど
最初の頃はExcel上とかRangeだとA1(A列、1行)って列、行の順なのにCellsは行、列の順だから混乱した記憶がある
>>830 入構2週間前からの体温を記録する資料の提出を入構2週間前切ってから要求された場合とかな
vbaじゃなくワークシート関数でできるけど
ユーザーフォームで使用するSubやfunctionプロシージャって標準モジュールに書くのが一般的? 独学だからよく分かんないのよね
個人的な好みだけどそのフォーム内でしか使わないならPrivate Subでサブルーチン作っちゃうかなぁ クラスモジュールとフォームの両方から呼び出したいとかだと標準モジュールに書かざるを得ないけど まぁそれにしてもプロシージャの頭にコメントで処理名、機能、引数、返り値、備考を書くようにはしてるからそこに何処から呼んでるかとかぐらいは書いておくけど
どうでもいいんじゃない? モジュール化云々が問題になるような粒度の責務をVBAに負わせている時点でシステム全体の設計を疑ったほうがいい
>>887 確かにワークブックイベントでユーザーフォームのpublic Subが呼び出せなかったからどこに書いたらいいのか迷ってしまったんだ
クラスの理解はなかなか難しい
参考になりました!
中学数学からはじめる微分積分
VIDEO ;t=4341s
中学数学からはじめる相対性理論
VIDEO ;t=10s
中学数学からはじめるAI(人工知能)のための数学入門
VIDEO 中学数学からはじめる三角関数
VIDEO ;t=3803s
汎用性が高そうなのは標準モジュールにするぐらいの適当さでいいよ VBAのメリットは手軽に書けるとこだし それより出来るだけメソッドで処理を区切るといいよ メソッド名で何してる部分なのか分かりやすくなるし、 変数の使い回しが避けられたり、コピペしやすくなったりメリットが多い
必要なパラメータが少なければな 毎回フォームのValue読むとか最低だし
課題が集約されてるサイトとかありますか? 検索してもIf文を使ってなど基本問題しかなく、もっと実用的なツール作成などの課題が欲しいです
2020/12/12(土) 20:52:45.95 ID:FxA0JWZG0 自称高レベル君乙w
-curl lud20241225192602caこのスレへの固定リンク: http://5chb.net/r/tech/1598756127/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「Excel VBA 質問スレ Part68 YouTube動画>5本 ニコニコ動画>1本 ->画像>8枚 」 を見た人も見ています:・Excel VBA 質問スレ Part67 ・Excel VBA 質問スレ Part50 ・Excel VBA 質問スレ Part74 ・Excel VBA 質問スレ Part65 ・Excel VBA 質問スレ Part77 ・Excel VBA 質問スレ Part70 ・Excel VBA 質問スレ Part75 ・Excel VBA 質問スレ Part72 ・Excel VBA 質問スレ Part69 ・Excel VBA 質問スレ Part73 ・Excel VBA 質問スレ Part66 ・Excel VBA 質問スレ Part71 ・Excel VBA 質問スレ Part49 ・Excel VBA 質問スレ Part57 ・Excel VBA 質問スレ Part63 ・Excel VBA 質問スレ Part51 ・Excel VBA 質問スレ Part60 ・Excel VBA 質問スレ Part58 ・Excel VBA 質問スレ Part64 ・Excel VBA 質問スレ Part61 ・Excel VBA 質問スレ Part79(ワッチョイあり) ・Excel Python 質問スレ ・Excel VBA 質問スレ Part81 (889) ・Excel VBA 質問スレ Part80(ワッチョイあり) (87) ・Excel ピボット Power Pivot DAX関数 質問スレ (13) ・Access VBA 質問スレ Part1 ・Access VBA 質問スレ Part2 ・Counter-Strike: Global Offensive 質問スレ Part3 ・【FFBE】 FINAL FANTASY BRAVE EXVIUS 質問スレ6 ・【FFBE】 FINAL FANTASY BRAVE EXVIUS 質問スレ7 [無断転載禁止] ・【PC】Terraria 質問スレ Part17 ・PSVita 質問スレ part1 [無断転載禁止] ・au Xperia Z1 SOL23 質問スレ part3 ・Florensia -フローレンシア- 質問スレ Part1 ・Tasker 質問スレ 17 ・d払い 質問スレ Part1 ・【FF14】FINAL FANTASY XIV 質問スレ103 ・Fallout4 PC 質問スレ 25cap ・ポケモンGo 質問スレ Lv.44 ・ポケモンGO 質問スレ Lv35 ・【FF14】FINAL FANTASY XIV 質問スレ106 ・ポケモンGO 質問スレ Lv17 ・ポケモンGo 質問スレ Lv.40 ・【FF14】FINAL FANTASY XIV 質問スレ124 ・ポケモンGo 質問スレ Lv.67 ・ポケモンGO 質問スレ Lv14 ・ポケモンGo 質問スレ Lv.59 ・ポケモンGo 質問スレ Lv.66 ・ポケモンGO 質問スレ Lv27 ・Warframe 質問スレ RANK32 ・【FF14】FINAL FANTASY XIV 質問スレ154 ・【FF14】FINAL FANTASY XIV 質問スレ174 ・【FF14】FINAL FANTASY XIV 質問スレ108 ・【FF14】FINAL FANTASY XIV 質問スレ161 ・ポケモンGo 質問スレ Lv.65 ・ポケモンGo 質問スレ Lv.64 ・ポケモンGo 質問スレ Lv.68 ・メギド72 質問スレ Part515 ・【FF14】FINAL FANTASY XIV 質問スレ146 ・【FF14】FINAL FANTASY XIV 質問スレ134 ・【FF14】FINAL FANTASY XIV 質問スレ135 ・【FF14】FINAL FANTASY XIV 質問スレ128
05:30:01 up 14 days, 15:54, 0 users, load average: 6.42, 6.66, 6.75
in 0.03387188911438 sec
@0.03387188911438@0b7 on 122619