Excel VBA 質問スレ Part68
レス数が1000を超えています。これ以上書き込みはできません。
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付ける
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part67
https://mevius.5ch.net/test/read.cgi/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
そのまま入力してちゃんと動いたから、問題文には間違いはない
https://i.imgur.com/kojc0gJ.png
それにしても学校の宿題だとしたらひどすぎるな
先生がこんなに汚いコードしか書けないとか生徒がかわいそう >>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)
https://i.imgur.com/kfSAyHL.png
印刷境界とかは分けて認識されてるから、なんだかんだ自分のコードを検証したほうがいいな あ、宣言とかしときながらシート指定するん忘れてやがる 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
そのマルチタスク、マルチウィンドウを否定したい理由は何なの? >>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を水槽にいれて泡がでたら無駄な隙間があるとか言う人いたな ジョブズじゃなかったんだな
そしてウォークマンでもなくてハンディカムのようだ
https://www.youtube.com/watch?v=O1mA5aAobQs
このサイトから ttps://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が呼び出せなかったからどこに書いたらいいのか迷ってしまったんだ
クラスの理解はなかなか難しい
参考になりました! 汎用性が高そうなのは標準モジュールにするぐらいの適当さでいいよ
VBAのメリットは手軽に書けるとこだし
それより出来るだけメソッドで処理を区切るといいよ
メソッド名で何してる部分なのか分かりやすくなるし、
変数の使い回しが避けられたり、コピペしやすくなったりメリットが多い 必要なパラメータが少なければな
毎回フォームのValue読むとか最低だし 課題が集約されてるサイトとかありますか?
検索してもIf文を使ってなど基本問題しかなく、もっと実用的なツール作成などの課題が欲しいです もう課題じゃなく必要なものを作ればいいんじゃね
必要なものがないなら何で勉強してんだよ VBAなんて解説サイト沢山あるんだから、
その場その場で分からない所をググればいいんじゃないの
カンニングokの試験のために勉強するようなもん
時間の無駄 >>894ですがレスくれた方どうもです
作りたいもの作れってのはその通りなんですけど特になくて...
依頼されて作るのは楽しくて会社でもツール作成をやらせてもらってるんですが、家でも勉強がてら何か作りたくてレスした次第です
作りたいもの考えることにします ピボットフィールド名に変数を使うとエラーになりました。
変数は使えないのでしょうか?何か方法あれば教えてください。
.Sheets("X").PivotTables("Y").PivotFields(変数) 職場が古臭い超巨大組織で、EXCELしか使えないからVBA
勉強してるんだけど、柔軟というか互換性重視しすぎというか
何でも許しすぎというか(暗黙のなんちゃらが多い)、てんこ
盛りすぎて使いにくいなこれ…
継承無いのも地味に痛い。普段めったに使わないけど、「ここは
インヘリタンスとポリモーフィズムっしょ」ってところで使えない。 >>913
EXCELで絵が描けるってだけで驚く職場ですわ。
「python とかC# か、せめてJAVAを…」って言ったら
py の時点で「はあ?」になって、「上司の自尊心を傷つけた
角」で有罪w 何か覚えたら人に知ったかぶりたくなる小学生じゃないんだからさ… VBAがなくなると脅されています
その時にはVBSもなくなりますか? >>920
ソース出せよ、あとどこからいつなくなるのかによる クラスを変数の格納で試しに使ってみたけど、値渡しのときに複数のsheetやRangeを一つのobjectとして送れるのが便利だった
それがいいのか悪いのかもすら分からんけど
あと宣言を減らせるのもいいな >>928
それって単なるTypeで定義するのとなんか違うの? >>912
PowerShellはダメなのか?
Windowsに最初から入ってるし継承使えるけど 互換性というより下手な拡張のせいだと思うが
a&b&c と書けないのがムカつく すでに引いてある枠線をすべてオートシェイプに置き換えることはできますか?
一括で変換できれば楽なんですが
そのようなことをしたい理由はExcelは先の太さのバリエーションがないのでオートシェイプで任意の太さの線にしたいからです 何かもうここ機能していないですね
荒らししかいない感じだ >>929
読み取り専用にしたいとか変数格納時にチェックしたいとかかなあ
typeもろくに使ってないから難しい質問 >>941
まあそう言う要件あるならそりゃクラスにするしか無いわな >>932
一回しか行わないわけだし手でやるのが普通ですよ
それにセルのサイズ変えたらズレるし
全部のセルの罫線みるのにどんだけ掛かるかw C列になし、0、文字列があって、
条件分岐で
C列が文字列であれば転記する文字列をそれに変更。転機列のD列には転記しない
C列がなしであれば同じ行のD列を見に行ってブランクであれば文字列を転記、文字が既にあれば転記しない
C列が0であれば次の文字列まで移動
上記のようなのは関数だと不可能だと思うので、マクロでどのように作ればいいでしょうか >>945
>C列がなしであれば同じ行のD列を見に行ってブランクであれば文字列を転記、文字が既にあれば転記しない
この意味が分からんのだけど誰か翻訳頼む。 ある程度自分で考えてそれでもわからない部分を聞くとかならともかく、丸投げ質問はスルーでおk >>947
自分はむしろ
「C列が文字列であれば転記する文字列をそれに変更」
の方が分からん この手のタイプは自分の見てるものが他人には見えてないってことがいつも抜け落ちてる 仮に転記文字列がEなら
Cが0(数値)
次のCまで移動
Cがなし
D列がブランクならEからDに転記
Cが文字列
EをCの文字列に変更、Dはそのまま
じゃないの?
でもなしとブランクが分かれてるのが謎 すいませんちょっと言葉が足りませんでした。
なしは単なる文字列のなしです
IFでなしという文字列があれば、現在設定している文字列をD列に書き出していく処理になります
C列 D列
りんご
なし
0
0
みかん
なし
↓
C D
りんご (ブランク)
なし りんご
0 (ブランク)
0 (ブランク)
みかん (ブランク)
なし みかん
上記のような処理を作りたいです。 条件分岐の所だけでもこういう感じで作ればいいというような回答を頂ければ助かります
かなり丸投げな質問になってすいません ちょっとみただけだけど関数でも頑張れば
作れそうに見えるがどうだろうか なしって入ったときに出てくるのがなしの1個上のセルの内容と決まってるなら関数でも書けるね このなぞなぞを思い出した
http://nazo2.myaasensei.com/?eid=90
なしなら「梨」と表記するか
別の果物、ぶどうとかすればいいのに
紛らわしい >>952
その条件通りにそのまま書き起こせば実現できることじゃないのか、複雑な処理がいるわけでもなし 関数で作れるならヒントでも頂けませんでしょうか
すいません。 =if(C1=″なし″,offset(C1,0,-1),″″)
こんな感じか スレッド眺めましたがまともに答えてる人ここはあまりいないんですね
失礼しました 流と関係ないけどここの人ってVBAはもちろんだけど関数も糞詳しいんだよなあ
VBAが関数の上位互換みたいなとこあるから当然か
SQRTとかここで教わったりセルの書式設定の代わりにVBAとかめちゃくちゃ助けてもらったわ 上位互換じゃなくて全く同等。
lambda関数導入でチューリング完全になったからね。 >>963
それだと、なしの横にりんごやみかんの文字列が表示されませんでした シート関数でもVBAでもどっちでもいいけど組むにあたってどの部分で詰まってるわけ? >>969
質問の仕方が下手ですいません
A列 B列
文字列A 空欄
空欄1 文字列A
空欄1 文字列A
文字列B 空欄
空欄2 文字列B
空欄2 文字列B
空欄2 文字列B
・
・
・
のようなシートがあって、IFでA列が空欄であれば文字列A、文字列Bのような転記を
機械的に行いたいのですが、関数を使ってIFの真偽判定で
文字列Aがヒットすれば、B列への転記内容を文字列A、文字列Bがヒットすれば文字列Bというような、
VBAのValueのような変数に文字列を格納しながら転記してく事が関数で可能か知りたかった内容です。
A列の文字列Aを空欄1にコピーして、文字列Bを空欄2にコピーするという操作もあればそっちも教えて頂きたい
(VLOOKUP等で文字列を参照する事が出来そうなので) >>945
D列がブランクかどうかを調べる必要があるので、転記列をE列、さらに作業列をF列として
C列はC2からデータ
D列はD2からデータ
E列はE2から =IF(C:C="なし",IF(D:D="",F:F,D:D),"")
F列はF2から =IF(AND(C:C<>"なし",C:C<>0),C:C,IF(INDEX(F:F,ROW()-1)="","",INDEX(F:F,ROW()-1)))
なし以外の文字列が最初にC列に出てくるまでは、とりあえずE列は空欄になる。 >>971
それなら、C列を作業列として
A列にA2からデータ
B列はB2から =IF(A:A="",C2,"")
C列にC2から =IF(A:A="",C1,A2)
でB,C列をドラッグで、では? 創作系は怠け者に厳しいから
こうやったけどうまくいかないってのは直してくれるが1から作ってってのはなあ >>952
0以外の数値も文字列に含めて、空白を停止フラグにした
これであってる?
Dim LastValue
LastValue = "未入力"
Dim Row As Range
For Each Row In Range("A:B").Rows 'A:B範囲を一行ずつ
Dim AColumn As Range, BColumn As Range
Set AColumn = Row.Columns(1) '処理中の行の一列目をAColumn
Set BColumn = Row.Columns(2) '処理中の行の二列目をBColumn
If (AColumn.Value = "") Then Exit For '空白で停止
If (AColumn.Value Like "なし") Then
If (BColumn = Empty) Then BColumn.Value = LastValue
ElseIf (AColumn.Value <> 0) Then
LastValue = AColumn.Value
End If
Next >>971
ワークシート関数で、条件付きで最後にある値を取るのは面倒だと思う
Filter関数とVlookup関数でできなくはないけど 974さんのやり方にinblankを付け足して解決出来ました
ありがとうございました。 >>978
単に 式をカッコで包んでるだけ
A = B + 1
を
A = (B + 1)
と書くのと同じ カッコも式の一部だから書くのは自由だけど処理上はまったく意味がない
たとえばこれでも別にエラーにはならない
If (((((a)) = ((b))))) Then zipファイルを解凍して別フォルダにコピー後にzipファイルと元の解凍ファイルをfso.deletefolderでまとめて削除するvba作ってるんだけどもなんでかzipファイルだけ削除できないんやがなんでや FUCK (((((●)) = ((●))))) 凸 YOU Office田中の人生きてるの?
突然Youtubeの更新が止まって数ヵ月過ぎた。 Excel関数のHyperLinkの処理を置き換え(APIHookのような処理)はどうすればできますか?
目的としてはHyperLink関数では一部のURLの表示が遅い(Excel自体のタイムアウト待ち?)ので
直接「CreateObject("WScript.Shell").Run URL文字列」の処理をさせたいのです
関数名はHyperLinkのままにしたいのでAPIHookのような処理ができればいいのですが >>990
普通にセミナー開いてたよ
つべは単に再生回数取れないから休止してるんでしょ >>993
そうか。
動画では💩上から目線で💩偉そうだったから生きてないのかと思った。 この三年でこのスレの人に救われた事が多すぎて感謝の念しかない
VBAどころかエクセルすら使わない仕事に変わるけど本当にみんなありがとう >>994
コメント欄に数式とかソース貼っとけばいいじゃん >>995
まあまあ、あの方のひととなりは業界では知る人ぞ知るで有名だから。
実際にトップクラスのテクニックの持ち主には間違いないからしゃーない >>998
いやプログラミングの業界で働いてたらあのくらいのスキルは低レベル。
それよりExcelのVBAごときで偉そうにしてるのは井の中の蛙。
あの人の周りには大量の低レベル社員が群がっているのだろう。
そんな低レベルの人が質問をしてきてそれに答えるばかりしているから自分が頭いいと勘違いしてるだけ。
もっと高レベルなプログラマーを目指してほしい。
こういう現象は高学歴な人が人生の早い段階でつまずき
予備校教師を目指す、というのにも見られる。
せっかく高学歴なんだからもっと自分のやりたいことに精力をそそげばいいのにね。
教育界で偉そうにすることしかできなくなった落ちこぼれ。 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 104日 8時間 57分 19秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。