X



Excel VBA 質問スレ Part67
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん (ワッチョイ 33da-3+hg)
垢版 |
2020/06/26(金) 02:01:29.56ID:uDfmpksE0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付ける

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part66
https://mevius.5ch.net/test/read.cgi/tech/1589085825/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
0003デフォルトの名無しさん (ワッチョイ 8fba-x+MM)
垢版 |
2020/06/26(金) 19:07:55.93ID:ZjxMZdyJ0
VBAでgrep検索を使いたいんだが教えてくれ。
https://website-note.net/vba/excel-grep-macro/
上のサイトのコードをコピペして動くまではいいんだけど、もう一つ条件を加えて
'キーワードを含むセルの情報をアウトプット時にキーワードの右のセルをアウトプットさせるようにしたい。
そこでOptionButtonを2つ作ってOpB1がtrueのときに普通に動いて、falseのときに
キーワードの右をアウトプットさせるコードを書いたんだがうまくいかない。
ifもselectcaseも試したんだけどだれか教えてくれ、VBA初心者で頭かかえてる。
つくったもの↓
'キーワードを含むセルの内容
If OptionButton1.value =then
省略 .Cells(lcnt, 7).Value = rFoundCell.Value
else
省略 .Cells(lcnt, 7).Value = rFoundCell.offset(0,1).Value
0005デフォルトの名無しさん (ワッチョイ 3f01-bXJj)
垢版 |
2020/06/26(金) 20:20:30.07ID:PIx3bjtD0
日本語訳:

上のサイトのコードだと
キーワードを含むセルの値が、G列に出力されます。

これを以下のように変更したいです

キーワードを含むセルを検索したあと、このセルの値だけでなく、このセルのすぐ右側のセルの値をH列に出力したいです。

できたら、オプションボタンを新設して、右側セルの値を出力するかしないかを選択できるようにしたいです





面倒だから後はお前らにまかせた
0006デフォルトの名無しさん (ワッチョイ 8fba-x+MM)
垢版 |
2020/06/26(金) 20:26:55.66ID:ZjxMZdyJ0
>>4すみません、コードはります
Private Sub outputCellInfo(ByVal sTmpPath As String, ByVal sFilePath As String, ByVal sTmpSheetName As String, _
ByVal rFoundCell As Range)
Dim OptionButton1 As Boolean
If OptionButton1 = True Then
With ThisWorkbook.Sheets(STR_GREP_SHEET_NAME)
.Cells(lcnt, 2).Value = lcnt - 7
.Cells(lcnt, 3).Value = sFilePath
.Cells(lcnt, 4).Value = sTmpPath
.Cells(lcnt, 5).Value = sTmpSheetName
.Cells(lcnt, 6).Value = convertRange(rFoundCell.Column) & rFoundCell.Row
.Cells(lcnt, 7).Value = rFoundCell.Value
End With
lcnt = lcnt + 1
Else:
With ThisWorkbook.Sheets(STR_GREP_SHEET_NAME)
.Cells(lcnt, 2).Value = lcnt - 7
.Cells(lcnt, 3).Value = sFilePath
.Cells(lcnt, 4).Value = sTmpPath
.Cells(lcnt, 5).Value = sTmpSheetName
.Cells(lcnt, 6).Value = convertRange(rFoundCell.Column) & rFoundCell.Row
.Cells(lcnt, 7).Value = rFoundCell.Offset(0, 1).Value
End With
lcnt = lcnt + 1
End If
End Sub
0010デフォルトの名無しさん (ワッチョイ 8fba-x+MM)
垢版 |
2020/06/26(金) 21:05:20.01ID:ZjxMZdyJ0
Elseの:はミスです…
オプションボタンの定義…ググりなおします
>>9そうです、全文では無いんですよね…全文検索くんもDLして
編集しようとしましたが今の私では無理でした。
0011デフォルトの名無しさん (ワッチョイ 8f01-Zl/h)
垢版 |
2020/06/26(金) 23:24:58.46ID:SBXE4EMs0
>>6
ぱっと見で分かるのは、OptionButton1が再定義されてて目的の値を参照してない事
Dim OptionButton1 を消して、>>3で自分で書いたようにOptionButton1.valueを評価してみて

あと、オブジェクト名にButtonって入ってるからコントロールだと思うけど、
もしコマンドボタンならこの用途でValueプロパティは使えないから、チェックボックスにしよう

解説サイトのソースも修正
grepExcelSheetメソッド
Loop While rTmpFoundCell <> rFoundFirstCell

Loop While rTmpFoundCell.Address <> rFoundFirstCell.Address

openExcelFilesメソッド
sTmpPath = Dir(sFilePath & "*.xls")

sTmpPath = Dir(sFilePath & "*.xls?")

それに伴って Do While sTmpPath <> "" 内の文を
If Not sTmpPath Like "*." & ThisWorkbook.Name Then 〜 End If
で括る

細かいこと言うと、Blean型を判定するときにリテラルと比較(= True や = False)はカッコ悪いから止めた方がいい
解説サイトではやってるけどね
0012デフォルトの名無しさん (ワッチョイ 8fba-U8IO)
垢版 |
2020/06/26(金) 23:25:32.05ID:ZjxMZdyJ0
>>3です
無理やりですが自己解決しました
標準モジュール2にアウトプットのコードをさわったものをコピペして
コマンドボタンクリックしたときの動作をIfでCallするようにしたら出来ました

でもやっぱりこのコード重いですね。どうにか軽くする方法無いものですかね。
0019デフォルトの名無しさん (ワッチョイ 8fba-8HP2)
垢版 |
2020/06/27(土) 08:53:12.31ID:9qJBLgyD0
>>
0020デフォルトの名無しさん (ワッチョイ 8ff1-of6p)
垢版 |
2020/06/27(土) 09:24:13.86ID:YKskLwzM0
<<
0023デフォルトの名無しさん (ワッチョイ cf46-pKDl)
垢版 |
2020/06/27(土) 10:49:37.32ID:gKvpRzl30
今日は、タイマー作ってます。
IeTimerに
Private Sub IeTimer1_Timer()
Me.Label1 = Now
Me.IeTimer1.Interval = 1000 - (Timer Mod 1000)
End Sub
とかいて見たのですが、何か一秒の長さが変に感じます。
気のせいなんでしょうか?。

Excel 97
OS;Windows 98
機種;NEC VersaPro NX VP13C
0024デフォルトの名無しさん (ワッチョイ cf46-pKDl)
垢版 |
2020/06/27(土) 10:55:33.95ID:gKvpRzl30
今日は、タイマー作ってます。
MsgBox 36000*24
はエラーにならないが
MsgBox 24*3600
は実行時エラーオーバーフローしました。
となります。

どうしてなんでしょうか?。
0029デフォルトの名無しさん (ワッチョイ cfce-htoQ)
垢版 |
2020/06/28(日) 00:22:47.53ID:/mLredfO0
VBAで宣言せずに数式を書くと、式の中で最初に出てきた数字によって型が勝手に決められる仕様
小数点があったら、小数点以下が0でもDouble型
32767以下の整数はInteger型
32768以上の整数はLong型
になる

だから「24*3600」という式を書くと、最初に出てくる数字は24だからInteger型とみなされて、24*3600はInteger型の制限範囲を超えてるからエラーになる

変数を使わずに数値の型を指定したい時は型文字を使うか実数型にしてしまう
この場合は
24& * 3600 (Double型)
24.0 * 3600 (Double型)
24# * 3600 (Long型)
と書けばエラーにならない

ちなみにVBA(Excel)のバージョンは関係ない
最新でも仕様は変わってないから同じ所でエラーになる
0031デフォルトの名無しさん (ワッチョイ 3f7f-nmuj)
垢版 |
2020/06/28(日) 07:45:50.98ID:/E8O58u/0
プロジェクトウィンドウが何かの表紙に名前順にソートされてしまったんですが、標準モジュール、クラスモジュール等の階層表示ってどうやって戻すのでしょうか
0035デフォルトの名無しさん (ワッチョイ 7f8e-hynA)
垢版 |
2020/06/28(日) 13:50:31.47ID:Gnbk8j2I0
>>34
何が適当なんだ?
言語仕様の基本だろう
>>33に俺を言うべき
0036デフォルトの名無しさん (ワッチョイ 7f8e-hynA)
垢版 |
2020/06/28(日) 13:50:52.16ID:Gnbk8j2I0
俺ではなくお礼
0038デフォルトの名無しさん (ワッチョイ 8ff1-of6p)
垢版 |
2020/06/28(日) 14:41:16.58ID:O22xrl4H0
>>33
0043デフォルトの名無しさん (ワッチョイ 8f40-Zl/h)
垢版 |
2020/06/28(日) 17:20:31.84ID:dFUOn9oJ0
>>35
式の中で最初に出てきた数字によって型が勝手に決められる → 嘘
32767以下の整数はInteger型 → 嘘
24& * 3600 (Double型) → 嘘
24# * 3600 (Long型) → 嘘

これで適当以外の何なんだよ
004423 (ファミワイ FFb3-pKDl)
垢版 |
2020/06/28(日) 17:53:16.30ID:n2mRaag0F
Timerに1000を掛けて見ても何か変だと思ったら
想定より早くIeTimerが実行される時があるみたいだ。

マシンの性能が良すぎるんですかね。
取り敢えず+200にして解決としときます。

MsgBoxの方は型とか考えたくないので
兎に角勉強になりました。 ありがとうございました。
0046デフォルトの名無しさん (ワッチョイ 0f43-3pn7)
垢版 |
2020/06/28(日) 19:21:56.72ID:nTfCGwDP0
特定のフォルダ内のファイルのファイル名を変えて、ついでにプロパティのコメントにも文字を入力したいです
for each f in fol.files
  f.name=ファイル名
  f.comment=コメント
next
みたいな感じでやりたいんですが、f.commentではだめなようです
どう書けばいいか教えてください
0056デフォルトの名無しさん (アウアウカー Sac3-jwjG)
垢版 |
2020/06/29(月) 13:58:37.89ID:T8IL5X90a
B1の値に応じて、C1からC100の値が変動します
A1からA100までの文字列をB1に順番に入れていって、1回ごとにC1からC100を別シートのD列に上から順にコピーしていきたいです
A1からA100とC1からC100は、必ずしも100まで値が埋まっているわけではなく、途中までしか埋まっていないこともあります
別シートにコピーするときに、C列の空白分はコピーしないでD列に空白行を作らないようにしたいです

Array = Range(A1:A100)で配列になるらしいんですが、Forでループさせるときに1個ずつB1に入れていくところでつまずいてます
ここからどうやってA1からA100までを順番に取り出していけばいいのでしょうか?
それと、C列をコピーするときに空白のところまでで選択を止めて必要分だけコピーするにはどうすればいいですか?
0058デフォルトの名無しさん (ワッチョイ 3f01-bXJj)
垢版 |
2020/06/29(月) 15:29:59.45ID:TB+oeC/70
どういう配列が作られたのかがそもそもわかんないって話でしょ?

デバッグの仕方覚えて、Arrayに何が入るかを確認できるようになったほうがいいわ
どういう配列が入ってるのかも確認できずに中身取り出すとかそもそも間違ってる
一行ずつ実行しながらローカルウィンドウで確認すれば
例えばこんな感じで配列が作られるのが確認できる
https://i.imgur.com/wDjGPTf.png
0059デフォルトの名無しさん (アウアウカー Sac3-jwjG)
垢版 |
2020/06/29(月) 15:49:01.80ID:T8IL5X90a
>>57
ありがとうございます
縦一行でも二次元配列というのになるんですね
基本的なことが分かっておらず、すみません

>>58
こんなのがあったとは・・・
活用させてもらいます、ありがとうございました
0060デフォルトの名無しさん (ワッチョイ 3f01-bXJj)
垢版 |
2020/06/29(月) 15:52:32.50ID:TB+oeC/70
仮想COM使ってるバーコードリーダーからEasycomm使ってデータ読み取ろうとしたけどわからんかった
その辺の知識身につけたいんだけどとっかかりが分からない
知識ある人がうらやましい
0062デフォルトの名無しさん (ワッチョイ 3f01-bXJj)
垢版 |
2020/06/29(月) 17:04:47.20ID:TB+oeC/70
>>61
いわゆるキーボードモード(USB HID)になってるようなバーコードリーダーならそうなんだけどね

今使ってるのは仮想COM(USB COM)の設定になってて、HIDに切り替えようとするとPC再起動
しないといけなかったり、何かと面倒なんだわ
COMモードじゃないとシステムに入力出来なかったりするものもあるしね
勝手にやっちゃうと職場の他の人に迷惑かけるし

そこでなんとかCOMモードのままでHID的にエクセルに出力できないかなって。
NW7のバーコード読取り結果を出力させたいってだけなんだけど、うまくいかなかった
0064デフォルトの名無しさん (ワッチョイ 3f01-bXJj)
垢版 |
2020/06/29(月) 17:27:14.16ID:TB+oeC/70
おっしゃる通りなんだけど
そこに立ちはだかる「セキュリティ?」の壁なんだわ
特にハードは目に見える分、よく分かってないお偉いさんでも口挟んでくる
おれ超末端だからハード新規導入は無理だ
ソフトは誤魔化せるんでこっちから攻めたかった
0065デフォルトの名無しさん (アウアウエー Sabf-PKxn)
垢版 |
2020/06/29(月) 17:37:54.02ID:6d9dL1u1a
それ、どっちがセキュアなんだかw

SD120(バーコードリーダー)を仮想シリアル通信で利用する
https://kagamikarasu.net/sd120_barcodereader_serial/
>これでプログラムに組み込むのが容易になるかと思います。

その先は知らん!
0070デフォルトの名無しさん (ワッチョイ 3f01-bXJj)
垢版 |
2020/06/29(月) 18:11:42.18ID:TB+oeC/70
セキュリティー的にはな、
でもうちのは「セキュリティ?」だから
>>69
一応何らかのデータは取得できてて、不正確な数字やらスペースやらは羅列される
まぁそもそも仕組み分からず動かしてる段階で自分としては納得出来てないんで
その辺を学習できるとっかかりが見つかればと思って書いてみただけ
心当たりなければいいよ
いそぐものでもないし課題の1つとして気長に取り組んでみるわ
0071デフォルトの名無しさん (ラクッペペ MM4f-TKJB)
垢版 |
2020/06/29(月) 18:19:31.08ID:6uUvaw7SM
関係ないけどcomってコミュニケーションのCOMでいいんだっけ?

昔 .com をカンパニーだと思ってたワシ
0074デフォルトの名無しさん (ワッチョイ 3f01-bXJj)
垢版 |
2020/06/29(月) 19:27:50.46ID:TB+oeC/70
>>72
さんきゅ
目通してみる
>>73
パラメータはバーコードリーダのマニュアルに載ってたんでそれ使った

最後に試したのが1年ぐらい前なんで
そのうちまたやってみるわ
ほんとはバーコードリーダを家に持ち帰れればいろいろ実験できるんだけどなぁ
職場のPCだと手荒な実験できないんで捗らない
0077デフォルトの名無しさん (スップ Sddf-uLB2)
垢版 |
2020/06/29(月) 20:58:53.82ID:p0BvfhePd
>>70
昔、そういうハードのサポートしてた。
POS関連でバーコ―ドリーダー、レシートプリンタ、何とかディスプレイ(金額表示)、キャッシュドロワーとか。

シリアルならフロー制御がどうなってるかとか含めて、ちゃんと設定しないとダメだぞ。
0078デフォルトの名無しさん (ワッチョイ 3fb5-jCQM)
垢版 |
2020/06/29(月) 22:23:41.83ID:R8I/2vyw0
ユーザーフォームに元に戻すボタンを作ろうと
奮闘中
・ブックやシート、列行の削除や挿入などはやらない
・セル内の数値同士の計算などをやらせる

基本的に無理だから*2のに対しては/2のボタン
とか逆を割り当てていこうかと思ったら四捨五入で座礁しますた
記録して元に復元させるってやり方かぁ
ムズそうすぎてちょっとあきらめてる
使用者には間違えるなと言うしかないか…
0082デフォルトの名無しさん (ワッチョイ 3fb5-jCQM)
垢版 |
2020/06/29(月) 22:50:58.30ID:R8I/2vyw0
一応タブ分けしてみた
一番左はデータを指定したシートに全部読み込む

次のタブで選択セル±の反転をさせる
最初はabsで絶対値にすればいいかと思ったけどマイナス値が必要な数値があったため*-1で

その次のタブで四捨五入
選択セルを0.00まで四捨五入するボタンと
0.0まで四捨五入するボタン

最後のタブで選択セル-A列にある数値の
引き算をさせるボタン

なんか工程毎にタブ分けしてみたけど
慣れないとみんな使いにくそう
なかなかなぁ
0083デフォルトの名無しさん (アウアウエー Sabf-PKxn)
垢版 |
2020/06/29(月) 23:04:34.75ID:SxZPiP67a
>>82
作業工程ごとに選択肢が複数あって
それぞれに元に戻すボタンをつけるの?
囲碁や将棋ソフトじゃないんだからさ
しかも完成しても使いにくいとか
考えたくないくらいめんどくせー、わし降りた。
0087デフォルトの名無しさん (アウアウエー Sabf-PKxn)
垢版 |
2020/06/30(火) 00:22:19.44ID:l6PnVpoXa
>>84
タブじゃなくてWordの葉書作成ウィザードみたいにしたらどうかな
アプリのインストールみたいに
順番に選択肢や入力欄があって
下にボタンで進んで行くイメージ[<<戻る][次へ>>][完了]
0088デフォルトの名無しさん (スップ Sddf-uLB2)
垢版 |
2020/06/30(火) 08:45:53.97ID:LUNyPqILd
>>84
根本的な考え方が違う。
フォームの内容を全部ユーザー定義かクラスに持たせて、そこ経由で動作させるようにする。
何かの動作はユーザー定義を元に動作させ、ユーザー定義をフォームに読み込むようにすれば簡単だ。
0090デフォルトの名無しさん (ワッチョイ 3fb5-jCQM)
垢版 |
2020/06/30(火) 18:08:03.74ID:ulIgP7Tu0
>>87
ありがとう、かなり見やすくかるかも
そのやり方でも作ってみるよ

>>88
ごめん、全く理解できん素人なので
教えてとは言えないからもう少しだけわかりやすく言ってもらえると
でも導入は厳しそうかなぁ
0091デフォルトの名無しさん (ワッチョイ cfcc-pPzt)
垢版 |
2020/06/30(火) 18:34:02.50ID:iUIa6Vpk0
配列の勉強中です
1行目にタイトルが入っていて、2行目以降に値が入っているシートで、C列に"年"、D列に"月"、E列に"日"が入っています。
そこで、同じ行のA列にC〜Eの値を結合して「年/月/日」の表示にしたいのですが、配列を使うにはどう書けばいいでしょうか?

Sub Test()

Dim i As Long
Dim LastRow As Long

LastRow = Cells(Rows.Count, 2).End(xlUp).Row

ReDim MyArray(LastRow - 2, 3) As Variant
ReDim DayArray(LastRow - 2) As Variant

MyArray = Range("C2:E" & LastRow)

For i = 0 To LastRow - 2
DayArray(i) = MyArray(i, 1) & "/" & MyArray(i, 2) & "/" & MyArray(i, 3)
Next i

Range("A2:A" & LastRow) = DayArray

End Sub
0092デフォルトの名無しさん (ワッチョイ 4fe6-TKJB)
垢版 |
2020/06/30(火) 18:39:14.24ID:Z3NkR/bn0
数式張り付けろや
009691 (ワッチョイ cfcc-pPzt)
垢版 |
2020/06/30(火) 19:40:39.93ID:iUIa6Vpk0
↓ですか?
"インデックスが有効範囲にありません"のエラーがでます

Dim i As Long
Dim LastRow As Long

LastRow = Cells(Rows.Count, 2).End(xlUp).Row

ReDim MyArray(LastRow - 2, 3) As Variant
ReDim DayArray(LastRow - 2, 1) As Variant

MyArray = Range("C2:E" & LastRow)

For i = 0 To LastRow - 2
DayArray(i, 1) = MyArray(i, 1) & "/" & MyArray(i, 2) & "/" & MyArray(i, 3)
Next i

Range("A2:A" & LastRow) = DayArray
0097デフォルトの名無しさん (ワッチョイ fff7-pPzt)
垢版 |
2020/06/30(火) 19:42:59.95ID:s83lPCQk0
配列数クソめんどいからこれでいいよ
Sub test()
Dim endRow As Long
endRow = ActiveSheet.UsedRange.Rows.Count
Dim ary As Variant
ary = Range(Cells(1, 1), Cells(endRow, 5)).Value
Dim i As Long
For i = 1 To endRow Step 1
ary(i, 1) = VBA.DateSerial(ary(i, 3), ary(i, 4), ary(i, 5))
Next i
Range(Cells(1, 1), Cells(endRow, 1)).Value = ary
End Sub
010291 (ワッチョイ cfcc-pPzt)
垢版 |
2020/06/30(火) 20:44:53.74ID:iUIa6Vpk0
すみません勘違いをしていました。最終行の

「Range("A2:A" & LastRow) = DayArray」

だと、A列が2行目以降空欄になってしまいます。

「Range(Cells(2, 1), Cells(LastRow, 1)) = DayArray」

も同じでしたが、

For i = 2 To LastRow
Range("A" & i) = DayArray(i - 1, 1)
Next i

だと入りますが、できれば一括で置き換えたいので、正しい書き方を教えてください
010491 (ワッチョイ cfcc-pPzt)
垢版 |
2020/06/30(火) 21:20:49.01ID:iUIa6Vpk0
>>103

Forの処理をこれに変えたらできました。ありがとうございます

DayArray(i - 1, 0) = MyArray(i, 1) & "/" & MyArray(i, 2) & "/" & MyArray(i, 3)
0105デフォルトの名無しさん (スプッッ Sd5f-at/t)
垢版 |
2020/06/30(火) 21:53:25.32ID:5LSCXiWjd
ListView(lvw1、lvw2)を2つ用意して、それぞれに同じデータを同じ順番に追加した状態です。
矢印キーの上下でlvw1とlvw2の同行選択状態ってどうやってやるんですか?
0109デフォルトの名無しさん (ワッチョイ 3fb5-jCQM)
垢版 |
2020/06/30(火) 22:39:03.05ID:ulIgP7Tu0
Sub 四捨五入()
Dim PP As Range
Dim SELU As Range Set PP = Selection.EntireRow Set PP = Intersect(PP, Range("G:AE")) If WorksheetFunction.Count(PP) = 0 Then Exit Sub Set PP = PP.SpecialCells(xlCellTypeConstants, xlNumbers) For Each SELU In PP SELU = Round(SELU, 2) SELU.NumberFormatLocal = "0.00;-0.00;0" Next SELU End Sub

昨日の俺です
こんな感じで四捨五入をしてる
やはり記録するかコピーしといて間違えたら戻す作戦かなあ
0111デフォルトの名無しさん (ドコグロ MMc3-qQym)
垢版 |
2020/06/30(火) 23:33:01.16ID:ayj87xxdM
>>110
「vba 別のブック間 コピー」でググればそれなりの答えのサイトは出てくるよ
0112デフォルトの名無しさん (ワッチョイ 1fe3-BXkI)
垢版 |
2020/07/01(水) 16:24:36.34ID:/ZTplk5x0
グラフの列の範囲を1つ進めて、範囲が変わったグラフを眺めてまた次の範囲を選択するマクロにしたいのですが、うまくいきません。
sleepで5秒待機するループにすると、マクロが終わるまでグラフはそのままです。
何か良い方法はありますか?
0121デフォルトの名無しさん (ワッチョイ 0b09-ERT+)
垢版 |
2020/07/01(水) 18:34:27.89ID:5XfsDMDI0
wordをcomで操作しているんですが、基本的にcomは
同期処理できないんですか?
たとえば、よくあるprintout(wordVBAの)〜Set wordApp = Nothing
の流れなんかは、Application.Waitを入れないと印刷される前に
終わってしまいます。
0122デフォルトの名無しさん (ワッチョイ 1e61-LTdq)
垢版 |
2020/07/01(水) 18:38:53.74ID:34UZRJ820
>>117
dim r as long
dim was as excel.worksheet
set we=activesheet
Do while r>0
if ws.cells(r,”A”)<ある値 then
ws.rows(r).delete shift:=xlup
else
r=r-1
end if
loop
パフォーマンスは知らん
0127デフォルトの名無しさん (ドコグロ MMc2-4eOZ)
垢版 |
2020/07/01(水) 21:01:32.84ID:v34eJavmM
>>122
(r,”A”)<ある値
顔文字に見えたわw
0128デフォルトの名無しさん (ワッチョイ 1eae-M/Ft)
垢版 |
2020/07/01(水) 21:43:01.53ID:H9TCgnXe0
Webで見たぐらいの初心者なのですが
書式設定の複数1行列を色変える作業が
200回ほどやらなきゃいけなく
マクロ組んでみようかと頑張ったのですが
上手くいきません

Dim a As Integer
Dim row1 As Integer
row1 = 3
For a = 0 To 200
Columns("row1 + a , P + a").Select
Selection.Format Conditions.以下略
Selection.Format Conditions以下略
With Selection.略
Selection略
Selection略
Selection略
End With
Next a

row1を無くしてb=3
これをColumnsをRange(b+a,b+a)
で出来ますでしょうか?
Rangeの指定カッコ内では数式を入れられないとかありますか?
0129デフォルトの名無しさん (ワッチョイ 1eae-M/Ft)
垢版 |
2020/07/01(水) 22:17:29.48ID:H9TCgnXe0
Range(cells(a,1),cells(a,16)).Select
でやってみます
0138デフォルトの名無しさん (ワッチョイ 1e8e-0gyK)
垢版 |
2020/07/02(木) 12:31:17.08ID:cWLbwDw40
馬鹿の特徴

「教えて」「助けて」

で始まる書き込みをする
0151デフォルトの名無しさん (ワッチョイ bb80-Rur7)
垢版 |
2020/07/02(木) 23:59:32.57ID:yXnL3NZ/0
誰か教えて。
式に=とか+を使うと字が読みにくくて困っています。
全角文字や絵文字を使うことはできないのでしょうか?
急いでいますからすぐに教えて、
0152 テトリス ◆SYKnw8OJpw
垢版 |
2020/07/03(金) 00:10:57.30
テスト
0154デフォルトの名無しさん (ワッチョイ 8aef-VQSO)
垢版 |
2020/07/03(金) 04:04:14.78ID:B7qpVotz0
Function 〓(ByRef a, ByVal b) : a = b : End Function
Function ┼(ByVal b, ByVal c) : 〓 ┼, WorksheetFunction.Sum(b, c) :End Function
これを入れておけば、=とか+から解放されるぞ

Sub test()
Dim a
〓 a, 1
Debug.Print ┼(a, 1)
End Sub
0157デフォルトの名無しさん (ワッチョイ 87cc-ERT+)
垢版 |
2020/07/03(金) 21:14:38.38ID:mplhmvvw0
ワークシートの条件にあう行を削除して上に詰めるみたいなことを、配列内でしたいです。

多次元配列"ary"内の1列目が66か、6列が1000か、28列目が空欄のレコードを削除するコードを教えてください
0158デフォルトの名無しさん (ワッチョイ 8ab5-5DWS)
垢版 |
2020/07/03(金) 21:23:34.89ID:Mxid+JS90
E列が空白になるまでE列とG〜M列に特定の処理をしたくて
Do loopを使って何とかできないかと悩んでたけど座礁しますた

Eの11行目を起点にして
E列の数値が正の数ならEもG〜Mも数値はそのまま
E列の数値が0ならEもG〜Mも数値はそのまま
Eの数値が負の数ならEとG〜Mの数値を-*1
と反転させたい
ってのは素人には荷が重すぎですかね?
0161デフォルトの名無しさん (ワッチョイ 27ce-BXkI)
垢版 |
2020/07/03(金) 21:55:13.66ID:4NyCV/dB0
Sub Macro1()
  r = 11 '起点の行
  Do While Cells(r, "E") <> ""
    If Cells(r, "E") < 0 Then
      Cells(r, "E") = -Cells(r, "E")
      For c = Asc("G") To Asc("M")
        Cells(r, Ch r(c)) = -Cells(r, Ch r(c))
      Next c
    End If
    r = r + 1
  Loop
End Sub
0162デフォルトの名無しさん (ワッチョイ 87da-VQSO)
垢版 |
2020/07/03(金) 22:17:41.55ID:aUU6z7Ir0
そもそもマクロ作るのって違うデータでも同じ処理をやりたいような場合じゃないのか
一回限りのデータ抽出ならわざわざマクロなんか作る意味ないんだけどな
無駄に時間を浪費したいのかな
0165デフォルトの名無しさん (ワッチョイ 0a2f-+ZV3)
垢版 |
2020/07/03(金) 23:04:06.95ID:KESc8IU30
>>157
VBAの配列に要素詰める命令はなかったはずなので、どうしてもというなら
 該当要素より下の要素を一つずつ上にずらす
 最後の要素を消す
とやればできなくはないがお勧めはしかねる
0167デフォルトの名無しさん (ワッチョイ 8ab5-5DWS)
垢版 |
2020/07/03(金) 23:26:37.07ID:Mxid+JS90
>>161
構文エラーでしたわ
>>166
VBAでやりたかったのです…
0172デフォルトの名無しさん (ワッチョイ bb1d-+upQ)
垢版 |
2020/07/04(土) 00:48:12.93ID:KIBH4SNT0
まだ22歳の学生社長が得た、23億円の「使い道」
あの橋本環奈をCMに使うバイトアプリの雄
https://toyokeizai.net/articles/-/319511
中学時代の車いす生活から、17歳で起業するまで
https://www.advertimes.com/20200130/article306925/
ミャンマー発 AIダイニングアプリ「Yathar」をしかける日本人起業家
https://roboteer-tokyo.com/archives/14840
自分の視野は「世の中の0.001%」と自覚せよ。ビジネスチャンスを掴む4つの習慣
https://headlines.yahoo.co.jp/hl?a=20200511-00010001-srnijugo-life
アプリの視聴率がわかる 高専卒起業家の独創力
https://www.nikkei.com/article/DGXMZO46695580Y9A620C1000000/
1万人の若者を支援!インターンが日本を変えるかも!? glowshipの若き創業者・足立卓也氏インタビュー
https://sogyotecho.jp/glowship-adachi-interview/
大学生起業家が設立1年で20億円調達! 単発バイトアプリに外食企業など出資【タイミー】
https://foodfun.jp/archives/3490
0173デフォルトの名無しさん (ワッチョイ a392-LTdq)
垢版 |
2020/07/04(土) 01:40:09.94ID:IOVEPry/0
一般論としては頻度の多い作業の方が自動化に向いてるのは確かだけど、
1回だけでも大量のデータを加工したり手作業でやるには時間のかかる作業もあり、
作業時間の方がコード書く時間より長くなる場合も多々もあるのでケースバイケースやね
0174デフォルトの名無しさん (ワッチョイ 5301-JCxG)
垢版 |
2020/07/04(土) 01:58:21.07ID:42LT/T3f0
逆に、山田やっとけ、というのはどうよ?
0176デフォルトの名無しさん (ワッチョイ 5301-JCxG)
垢版 |
2020/07/04(土) 02:09:15.54ID:42LT/T3f0
データの加工。
0178デフォルトの名無しさん (ワッチョイ 5301-JCxG)
垢版 |
2020/07/04(土) 02:13:10.44ID:42LT/T3f0
いや、山田がやってくれないかなって。
だめ?
0181デフォルトの名無しさん (ワッチョイ 5301-JCxG)
垢版 |
2020/07/04(土) 03:10:27.15ID:42LT/T3f0
田中のほうが良いかな?
0184デフォルトの名無しさん (ワッチョイ 8a01-5cl0)
垢版 |
2020/07/04(土) 07:02:36.51ID:VZt6Ms3K0
do whileとかほとんど使わないわ
あれ試行錯誤してる最中に脱出条件間違えて固まるとイライラってするんで

>>158こういうのは
途中で空白行挟んでたらどうすんのとか考えるとEnd(xlup)とか使って無難にforで回したい
最も空白行挟んでたらそこまでしか処理しないのかもしれんけど
それなら上から順に一旦回して空白行がどこに出るのか調べてからやるわ
全データ配列に格納してからやれば速度的にも問題ないと思うし
0185デフォルトの名無しさん (スップ Sdaa-tYaB)
垢版 |
2020/07/04(土) 07:59:26.14ID:yagtSNgld
観測地点が全国で2000ヶ所、1時間毎の観測結果3年分のデータがあって、8時間毎に観測出来なかった場合も踏まえて平均し、観測出来なかったのが8時間の内4時間以上あったら平均値も出力出来なかったとする。
で、その8時間の平均値は1時間ずつずれて24個分で1日のデ―タとなるんだが、それをさらに平均して1日の値とする

なんてのやったが1回限りでもVBA使わないと無理。
というか普通に考えてVBAでも無理だけどね。
0187デフォルトの名無しさん (ワッチョイ 1e8e-0gyK)
垢版 |
2020/07/04(土) 10:01:18.86ID:1naoKVTK0
>>185
お前の低い知能の頭ではできないだけだろ
0192デフォルトの名無しさん (ワッチョイ 8a01-5cl0)
垢版 |
2020/07/04(土) 13:05:03.59ID:VZt6Ms3K0
>>157
全要素forで回しながら
条件合うものだけを新しい配列newArrayにいれていけばいいじゃん
その後新しい配列から、データ空にしたシートに記入

新しい配列の要素数、特に1次元要素数(行数)だけど
Redim Preserveで順次増やしていくのはこの場合できないから、
一旦行数を確定するためだけにfor回してカウント
要素数確定したnewArray作ってから
もう一度for回して入れていけばいい

行列逆転させればredim preserve使って一発でもいけるか
特に巨大なデータでなければ間違い避けるために二回まわすなおれなら

行削除によって表自体の体裁を上に詰めていきたいっていうなら
最初にforを回した後、元の行数とnewArrayの行数の差だけ表の行を削除
データはすでに配列にとってあるんだからどこから削除しても構わない
0196デフォルトの名無しさん (ワッチョイ bbda-fHqu)
垢版 |
2020/07/04(土) 14:21:18.07ID:/jHrZd8o0
データ値の定常状態と過渡状態を理解していれば分かる
粒度が荒いと応答性が悪化するので現象の追従が遅れる
安定時のデータ値だけならともかくデータの変化を取りこぼすリスクが高くなるんだよ
0198デフォルトの名無しさん (ワッチョイ bbda-fHqu)
垢版 |
2020/07/04(土) 14:44:04.22ID:/jHrZd8o0
上限、下限決め打ちの場合はトリガ仕込むのでも通用はする
ただ一日当たりの変化量でアクション起こす場合はどうする?
移動差分(微分)を連続的にデータ処理しないと難しい
0200157 (ワッチョイ 87cc-ERT+)
垢版 |
2020/07/04(土) 14:58:18.35ID:oup49XFx0
>>186

仮の配列を作り、編集してaryに入れるようにしたいのですが
これだと、全て空欄になってしまいます
Dim i As Long, j As Long, cnt As Long, cnt2 As Long
i = Cells(Rows.Count, 1).End(xlUp).Row
'仮の配列
ReDim Kariary(i, 30) As Variant
Kariary = Range("A2:AD" & i).Value
'最終的に代入する配列
ReDim ary(i - 1, 30) As Variant

For cnt = 1 To i - 1
If Not Kariary(cnt, 1) = 66 Or _
Kariary(cnt, 6) = 1000 Or _
Kariary(cnt, 28) = "" Then

j = UBound(ary) + 1
If j < i - 1 Then
For cnt2 = 1 To 30
ReDim Preserve ary(j, 30) As Variant
ary(j, cnt2) = Kariary(cnt, cnt2)
Next cnt2
End If
End If
Next cnt
'シートを一旦クリア
Cells.Clear
Range("A2:AD" & i) = ary
0202デフォルトの名無しさん (アウアウエー Sa82-h0J+)
垢版 |
2020/07/04(土) 15:22:36.21ID:ZKMg5qK7a
>>198
地デジのようなリアルタイムデコードじゃなくて
過去に既に起こってしまったデータ欠損の過ちをVBA で穴埋めしようとしたたところで土台遅いと言う話でした。
>>199
そうですね
0203デフォルトの名無しさん (ワッチョイ 8a01-5cl0)
垢版 |
2020/07/04(土) 15:31:40.93ID:VZt6Ms3K0
>>200
頭が痛くなってくるんだけど
まずifの条件がおかしい
自分で簡単の作って確かめてみ
こういうの
思ってるような動きするか確かめてみ
プログラムってのはそういうことしないとだめだわ
まっさらなxlsm作ってデータも簡単のシートに作ってやってみ
そうすりゃすぐ分かる

Sub teeee()
 With ActiveSheet
  If Not .Cells(1, 1) = 66 Or .Cells(2, 1) = 2 Then
   MsgBox "ok"
  End If
 End With
End Sub

例えばさ、
ary(j, cnt2) = Kariary(cnt, cnt2)
これにブレークポイントつけてここに到達するケースがあるか調べてみ
それだけで何か分かるわ

まぁだれか正解のコード書いちゃうんだろうけど
デバッグ
ブレークポイント
これ使えないとまともなコード書けないぞ
0207デフォルトの名無しさん (スプッッ Sd4a-tYaB)
垢版 |
2020/07/04(土) 16:03:39.61ID:DEQjmcqBd
>>187
>>190
やって見てから言えよw
問題は時間だ。

2000x365x24x3=52560000

100列で50万行だぞ。
実際やったわけだが、普通にやって6時間とかかかる感じだった。
勿論、初心者じゃないから2次元配列使うのも当然やってる。

まあ、6時間もかけたく無かったからマルチプロセスにして1時間ぐらいにしたけどな。
0209デフォルトの名無しさん (アウアウエー Sa82-h0J+)
垢版 |
2020/07/04(土) 16:09:00.53ID:MUUOvXMba
data.csv
年月日,時間,気温,湿度
2020/07/04,11:15,28.5℃,78%
2020/07/04,12:15,ー,78%
2020/07/04,13:15,28.5℃,ー
2020/07/04,14:15,ー,ー
2020/07/04,15:15,28.5℃,78%
・・・
・・

1カ月データとして24時間×31日=744行+先頭行
1年12ヶ月データで8,928行かぁ
データスルーとかデータ穴埋めとかって
どっちの場合も
VBA じゃなくてデータベースのSQLで出来たりするのかな?
0210デフォルトの名無しさん (ワッチョイ 1bac-OmMV)
垢版 |
2020/07/04(土) 16:22:41.23ID:DNEaiqy30
おれならそもそも案件をRDBMSに移す提案をするわ
だめなら元データはどうせCSVやJsonかなにかだろうし、VBAから普通にRDBにいれてプロシージャ叩くとか
外部プログラムで直に処理するね

元データがExcelでExcel縛りなら、どうやって案件から手を引くかを考えるねw
Excel起動するVBAでやることじゃない
まあ金次第でもあるけど
0211デフォルトの名無しさん (スプッッ Sd4a-tYaB)
垢版 |
2020/07/04(土) 16:30:22.62ID:DEQjmcqBd
>>209
う〜ん、場所毎だから表になるっちゃあなるけど、SQLでやろうとは思わなかったし、どうやってやるのかも思い付かんわ。
仕事でSQLばかり触ってるが。

>>210
おう、確かに元データはCSVだった。
SQLで上手いことやるのが思い付かんが。
0217200 (ワッチョイ 87cc-ERT+)
垢版 |
2020/07/04(土) 17:35:53.50ID:oup49XFx0
>>203
おっしゃる通りでした。
IFに問題があったみたいです。ありがとうございました。
0219デフォルトの名無しさん (ワッチョイ 1e8e-0gyK)
垢版 |
2020/07/04(土) 17:49:24.23ID:1naoKVTK0
>>207
お前が馬鹿なだけだろ
全部メモリーに置く理由もない
己の頭の問題を仕様の問題とすり替えるな
0220デフォルトの名無しさん (ワッチョイ 87cc-ERT+)
垢版 |
2020/07/04(土) 17:54:43.71ID:oup49XFx0
A列の2行目以降に値あり、B列の2行目以降に同じ行のA列の値が
上から何回目に出現したかを返す関数として「=COUNTIF($A$1:A2,A2」を使っています。
同じことを配列で使用する方法を教えて下さい。
(A列の値は並び替えをしてあります)

Dim EndRow As Long, r As Long

EndRow = Cells(Rows.Count, 1).End(xlUp).Row
ReDim ary(EndRow, 2)
ary = Range("A2:B" & EndRow).Value

For r = 1 To EndRow - 1
ary(r, 2) = Application.WorksheetFunction.CountIf _
(Range(ary(1, 1), ary(r, 1)), ary(r, 1))
Next r

これだとRangeメソッドは失敗しましたになります。
0222デフォルトの名無しさん (ワッチョイ 8a01-5cl0)
垢版 |
2020/07/04(土) 19:58:17.09ID:VZt6Ms3K0
>>185
批判したいとかそういうもんじゃないんだけど
わりと大きなデータ扱うことに興味があったんでどんなもんか実際やってみた

1カ所分しかやってないんだけど
csvから取得して平均値26280個をシート記入するまで1秒もかかってない感じ
一日ごとの平均は出してないけどこの分じゃそれほど差はないと思う

もしや取得時には配列で一括取得してても
シート記入時に配列使った一括記入してないんじゃ?


も少し情報提供すると
https://www.data.jma.go.jp/gmd/risk/obsdl/index.php#
ここから3年分時間別気温データを、1年ごとcsvにして三個ダウンロード

https://www.moug.net/tech/exvba/0060086.html
これと同じ感じでOpen使って取得
年ごとに必要な気温データのみ1次元配列に入れる

3つの配列を1つの配列にまとめる

平均値入れていく配列AveArrayを新しく作る(あえてString宣言)
あとはforで回しながら過去8時間分のデータを調べてデータない場合の個数を調べて
4つ以上ならAveArrayにN/Aを入れる
4つ未満なら8時間合計して、有効データ数で除算し、AveArrayに入れる

AveArrayを列数1の2次元配列にしてからシートに一括記入

なんかおれ間違ってる?
0227デフォルトの名無しさん (スプッッ Sd4a-tYaB)
垢版 |
2020/07/04(土) 23:58:08.33ID:DEQjmcqBd
>>222
ちょっと見た感じほぼ、俺と同じ感じだね。

>もしや取得時には配列で一括取得してても
シート記入時に配列使った一括記入してないんじゃ?

オイオイ、そんな素人なわけ無いだろ。

Line inputを使ったか、それより速いバイナリ読み込み+StrConv使ったかについては覚えて居ない。
まあ、速いといっても劇的に速くなる訳じゃないから、そんなことよりマルチプロセスってことでLine inputのままだったかも。

オレがやった時のデータは日付+24列のデータだった。
貼り付けは元データ込みで、元データの右に8時間平均と1日平均書いたと思うが、もしかしたら8時間平均は出力しなかったかも。

多分読み込みよりも列を増やした二次元配列にして書き込みにも利用してたと思う。
0231デフォルトの名無しさん (ワッチョイ bfe6-s8sF)
垢版 |
2020/07/05(日) 01:59:51.75ID:S3+IlzuQ0
>>230
その程度vbaなら自由自在でしょ
バカにしないでください
0232デフォルトの名無しさん (ワッチョイ 1e8e-0gyK)
垢版 |
2020/07/05(日) 02:04:39.40ID:sCEs+yW00
>>227
お前の書き込みは、
「というか普通に考えてVBAでも無理だけどね。」
だろ

後付けで時間がとか言い出して誤魔化すんじゃねーよ
0234デフォルトの名無しさん (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/05(日) 07:10:34.18ID:Mq9FuBzw0
標準モジュールに、
Sub 1()
・・・
・・・
End Sub

Sub 2()
・・・
・・・
End Sub

Sub 3()
・・・
・・・
End Sub
と、書いていき、Sub 1()がSub 2()を呼び、Sub 2()がSub 3()を呼ぶ、って可能でしょうか?
0235デフォルトの名無しさん (スプッッ Sd4a-tYaB)
垢版 |
2020/07/05(日) 07:16:23.84ID:2yUokYO9d
>>232
???
日本語が理解出来ないのか?

>なんてのやったが1回限りでもVBA使わないと無理。

「やった」と書いて有るだろ。
その後に「普通に考えて」とも書いてる。

実際にやったが、普通はVBAでも無理という意味だよ。
>>222とほぼ同じで6時間かかるからマルチプロセスにしたんだからな。
0236デフォルトの名無しさん (ワッチョイ 8a01-5cl0)
垢版 |
2020/07/05(日) 07:44:05.89ID:VaIdJVAp0
>>227
せっかくなんで
csvは日付+24列に加工してみた

1カ所の8時間ごと平均データ26280個を作って1列に貼り付けるfunctionを作る
引数は貼り付け先の列の列番号

これを
@1回だけ実行 A列のみに貼り付け
A100回実行 A列から右100列に1列ごと貼り付け
B200回実行 A列から右200列に1列ごと貼り付け


timer付けて一応測ってみた

@0.31秒
A32秒
B67秒

2000回だと12分ぐらいか?

CPU i5-4670
メモリ 24GB
Win7

実行時はPCでテレビ見ながらJane2個起動
firefox、Janetterなど20個以上のアプリが動いてる

環境やらデータの数値の大きさやらで
差は2000倍に拡大する可能性があるんで何とも言えない
うちの職場のしょぼいPCでやったらもっと酷いと思う
0237234 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/05(日) 07:54:44.65ID:Mq9FuBzw0
>>234をグーグルで検索するには、どういうキーワードで検索すればいいでしょうか?
0238デフォルトの名無しさん (ワッチョイ 872c-+ZV3)
垢版 |
2020/07/05(日) 07:57:11.74ID:R1IME3L+0
>>228
Ruby で作った。
ただし、DryRun なので実際には実行されません!

require 'fileutils'

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/Users/Owner/Documents/*"
src_dir = File.dirname( glob_pattern ) # ディレクトリパスだけを取り出す

Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ処理する
.each do |full_path| # 1つずつ処理する
dest_path = src_dir + "/" + "2020_" + File.basename( full_path ) # ファイル名
FileUtils::DryRun.move( full_path, dest_path )
end

# mv C:/Users/Owner/Documents/a.txt
# C:/Users/Owner/Documents/2020_a.txt
0239234 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/05(日) 08:01:08.68ID:Mq9FuBzw0
>>228
ファイルをバイナリで読み込んで、バイナリで書き出す、
で、書き出す際に、ファイル名に"2020"&、とすればいい。
0241デフォルトの名無しさん (アウアウエー Sa82-h0J+)
垢版 |
2020/07/05(日) 08:04:40.53ID:nDNnOTMWa
>>234
普通に最後にサブルーチンの名前呼び出し書いたら良いのでは?
Sub 1()
・・・
・・・
2
End Sub

Sub 2()
・・・
・・・
3
End Sub

Sub 3()
・・・
・・・
End Sub
0242234 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/05(日) 08:05:40.42ID:Mq9FuBzw0
>>240
どうもです。
0243234 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/05(日) 08:06:29.51ID:Mq9FuBzw0
>>241
どうもです。
0245デフォルトの名無しさん (ワッチョイ 0a2f-+ZV3)
垢版 |
2020/07/05(日) 13:58:43.83ID:U1BgWcwt0
>>207
VBAでやっても6時間はかかりすぎな気がするが
マシンスペックとコード晒してみ

それ、計算式でやって再計算に1時間以上かかるのか?
当然試してるよな

マルチプロセスもどうやってやったのか気になるが
俺なら間違いなくDBにつっこんでSQLでやる

そういえばエクセルシートなりCSVなりに対してSQL投げる方法がいくつかあったけど
それは試したのか?
0248デフォルトの名無しさん (スプッッ Sd4a-tYaB)
垢版 |
2020/07/05(日) 15:16:11.04ID:2yUokYO9d
>>245
SQLに投げるのは簡単だが、今回の問題でどういうSQLで出来るのかが分からんかった。
今でも思い付かんが。

計算式ではやってないな。
まあ、無駄なんで。
というか、本当にやる奴が出るとは思わんかったから、言わんかったが他にも制約は有ったんだわ。

それにしても>>236は速いな。
ちょっとおれも調べてみるか。
ちなみにこの仕事数年前なんで完全に憶えてるわけじゃない。
0249デフォルトの名無しさん (スプッッ Sd4a-tYaB)
垢版 |
2020/07/05(日) 15:22:54.54ID:2yUokYO9d
マルチプロセスはExcel.Application8個(自分含めて)呼び出して、自分のブック開いて別CPUにやらせるプロシージャをApplication.OnTimeで呼び出したかSetTimerで呼び出したかだったんじゃないかな。

細かい連携しないで済むようにしてたと思う。
複雑なことはやってねえよ。
0251デフォルトの名無しさん (スプッッ Sd4a-tYaB)
垢版 |
2020/07/05(日) 21:27:28.28ID:2yUokYO9d
>>236
う〜ん、分からん。
俺もやってみたんだが、同じような時間だった。
観測値はテキ卜一に0〜100をランダムで書き込み。
観測出来なかった値は当時の記憶を頼りに9999とした。
確か9998もあったけど変わらんだろう。

前に書いた制約というかは、1年分のファイルが50〜60個ぐらいだったということ。
つまり県ごとのファイルで観測地が多い所は複数ファイルって感じ。
だから実際は行頭に観測地名が入って、その後に何かの数値とかが幾つかあって日付、観測値という具合だった。
年ごとのファイルが完全に固定フォーマットで無かったか、俺が信用してなかったか、観測値名で検索してたと思う。
そこから365日分は連続してたと思うけど。

それでも6時間は掛からんような気がしてきた。
もっと複雑なことやってたのかなあ。

どっちにしても後だしで申し訳ない。
0265デフォルトの名無しさん (ワッチョイ 87cc-ERT+)
垢版 |
2020/07/06(月) 18:39:32.80ID:XttWreH00
For
処理1
処理2
処理3
処理4
Next

よりも

For
処理1
Next

For
処理2
Next

For
処理3
Next

For
処理4
Next

の方が処理が早い傾向がありますが、そういうものですか?
0270デフォルトの名無しさん (ワッチョイ 3aba-/RNd)
垢版 |
2020/07/06(月) 21:12:06.08ID:tFUllOPh0
>>268
どこでもかしこでもRubyで書いて押し付けてきて、「出来だよ!」っていうオジサンがいるのよ。
WSHスレでは「Rubyおじさん」として有名だった。
が、自分よりスキルの上な奴がコードをうしたら黙り込む。
こんなところにまで出張いてるとはね…。

無視推奨。Rubyはオワコンだし。
0277デフォルトの名無しさん (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 20:15:33.65ID:2cf+0s2v0
音楽のmidiファイルを作りたい、つまりバイナリファイルを作りたい者です。で、
↓を試してみたいのですが、"C3"にバイナリの配列を書き込まなければいけません。
この場合、どうやってexcelのセルに、バイナリの配列データを書き込むのでしょうか?

https://oshiete.goo.ne.jp/qa/8402512.html
Sub test()
 TEMP = Worksheets("Sheet1").Range("C3")
 ReDim BIN(Len(TEMP) / 2 - 1) As Byte
 For I = 1 To Len(TEMP) Step 2
   BIN((I - 1) / 2) = Val("&H" & Mid(TEMP, I, 2))
 Next I
 Open "1.BIN" For Binary As #1
 Put #1, , BIN
 Close #1
End Sub
0280犬丸 ◆MRCYWQz4rc (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 20:31:41.96ID:2cf+0s2v0
>>278
和音の構成音(ドレミ・・・)を1つづつセルに入れられるから。
0282デフォルトの名無しさん (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 20:34:49.08ID:2cf+0s2v0
あと、PCにインストールされてる開発系はexcelだけだから。
0283277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 20:41:28.24ID:2cf+0s2v0
つか、改変させたいmidiファイルが300個位あって、それの欲しいデータのexcelファイルへの読み込みはもう終わったわけ。
あとは、そのデータをちょい改変して、同様な300個のmidiファイルを吐き出すだけなんですよ。
0284277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 20:42:49.00ID:2cf+0s2v0
だから、excelでバイナルファイルを作りたいのです。
0287277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 21:10:37.49ID:2cf+0s2v0
>>285
日本語だってそうだろ。
読むのは簡単。 書くのは大変なんだよ。

>>286
ネットで買った和音だけの簡単なデータで改変したデータを自分だけで使うぶんには問題ありません。
0288デフォルトの名無しさん (ワッチョイ 1bac-OmMV)
垢版 |
2020/07/07(火) 21:13:27.88ID:BPFgnJg70
じゃあそうすればいいじゃない?

所詮16進数の文字の羅列(Byteの配列とかにはさすがに出来てるんやろ?)なんだから
最終的には好きに料理してファイルに吐き出せばいい
ただ、1つのセルにバイナリなんて入れたら手作業で編集なんてしずらくてしょうがないけどな
あとセルの文字数上限もあるだろうし
midiの規格書読んだことあるのかしらんが、よくチャンクとかバイナリいじって編集しようと思うな
0290277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 21:14:00.67ID:2cf+0s2v0
>>286
そもそも観賞するためのmidiデータではなく音楽制作に使うツールとしてのmidiデータなんだよね。
0292277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 21:22:41.71ID:2cf+0s2v0
>>288
> midiの規格書読んだことあるのかしらんが、よくチャンクとかバイナリいじって編集しようと思うな
基礎的な部分は把握してます。

> 所詮16進数の文字の羅列(Byteの配列とかにはさすがに出来てるんやろ?)
これがわからないんです。たとえば、4D 54 68 64という16進のデータをexcelの1つのセルに書き込む方法を教えて欲しいのです。
0293277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 21:25:44.85ID:2cf+0s2v0
で、excelの"C3"に、4D 54 68 64を書き込んで>>277のソースを動かして試してみたいんです。
0298デフォルトの名無しさん (ワッチョイ 1bac-OmMV)
垢版 |
2020/07/07(火) 21:35:25.31ID:BPFgnJg70
>>292
セルに入れられるのはあくまで文字列ってこと理解してないの?

その例なら「Byte(0):77 Byte(1):84〜」とかいう配列から「4D 54 68 64」という文字列にしなければセルには書き込めない
Byteはそれぞれの数値が入ってるだろうけど、hexかなんかで16進数にしたうえで(編集上必要あるか知らんけど)
join(array, " ")かなんかで1つの文字列にする

くっそ編集しずらいだろうけどな
0299デフォルトの名無しさん (ワッチョイ 8ab5-5DWS)
垢版 |
2020/07/07(火) 21:44:56.92ID:tZSrRerM0
前スレのテキストフルスキャンの発想とコード提示してくれた人
改めて言わせて貰う
職場の一大イベントを乗り切ったわこれで
0300デフォルトの名無しさん (ワッチョイ 8ab5-5DWS)
垢版 |
2020/07/07(火) 21:46:02.99ID:tZSrRerM0
改めて多大なるお礼を言わせて貰うが抜けてた

これのおかげですべての可能性が広がったわ
0301277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 22:23:53.24ID:2cf+0s2v0
では、すみません。 >>277の質問はなしにして、↓の質問をお願いします。

1、変数に「4D 54 68 64」のバイナリデータを代入するソース
2、中身は「4D 54 68 64」だけのファイル
3、ファイル名は5ch.bin
こんなファイルを作るにはどのようなソースを書けばよいでしょうか?
0302277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 22:29:17.16ID:2cf+0s2v0
>>228
allrenameというフリーソフトを使えばいいのじゃ。
0304301 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 22:42:26.54ID:2cf+0s2v0
>>303
すみません。 「VBAを使って」でした。
0305デフォルトの名無しさん (ワッチョイ 0302-WfHi)
垢版 |
2020/07/07(火) 22:43:37.27ID:O/UE8zUS0
もはやExcelを使うことが目的化してる
0307301 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 22:54:30.10ID:2cf+0s2v0
>>306
基礎になるソースさえ教えてもらえれば、そこに色々付け加えてって自分に必要なバイナリファイルが作れるんですよ。
0309デフォルトの名無しさん (スッップ Sdaa-DbYN)
垢版 |
2020/07/07(火) 22:57:22.32ID:0KBHODZEd
>>307
そろそろ死ねや
0310デフォルトの名無しさん (ワッチョイ 3a02-ERT+)
垢版 |
2020/07/07(火) 23:05:51.69ID:1TMQwlbY0
Excelの設定もAppDataの中身も場所も変えて無いのに、
下記のように表示されてマクロが読めません!

「起動フォルダーにある個人用マクロブックは記録のために開かれた状態でなければなりません」
0314301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 01:45:46.54ID:gPwSdoJG0
>>312
ありがとうございます。でも、「セルから変数を代入する」は止めました。で、>>277を変形してみたんですけど、↓のドコがまずいんですかね?

Sub test()
Dim TEMP As Variant
Dim I As Variant
Dim BIN As Variant

TEMP = Array(&H4D, &H54, &H68, &H54, &H68, &H64)
ReDim BIN(Len(TEMP) / 2 - 1) As Byte
For I = 1 To Len(TEMP) Step 2
BIN((I - 1) / 2) = Val("&H" & Mid(TEMP, I, 2))
Next I
Open "C:\1.BIN" For Binary As #1
Put #1, , BIN
Close #1
End Sub
0315301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 01:49:45.50ID:gPwSdoJG0
つか、
ReDim BIN(Len(TEMP) / 2 - 1) As Byte
この部分が何だかわかんないんですよ。
まず、ReDimとは何だ?と。
0316301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 02:05:21.42ID:gPwSdoJG0
目的は、
&H4D, &H54, &H68, &H54, &H68, &H64という6個のバイナリデータだけの、
1.BINというファイルを作りたい!
です。
0319デフォルトの名無しさん (ドコグロ MM43-jxlo)
垢版 |
2020/07/08(水) 03:24:41.69ID:llacuNM3M
ここで聞くより、「vba バイナリデータ」でググったほうが早そう
0322デフォルトの名無しさん (アウアウエー Sa13-c9t6)
垢版 |
2020/07/08(水) 06:25:23.32ID:yrsbI81qa
>>315> ReDimとは何だ?と
思ったらググって下さい。
ReDim BIN(Len(TEMP) / 2 - 1) As Byte
よくわからないですが動的配列を半分の長さで確保してるようです。
512÷2-1=255
forで繰り返すMid関数のスタート引数が1からのため配列の0番を1つ引算してまふ
「4D 54 68 64」ではなくてスペースなし「4D546864」か
Replace関数でスペースを削除しましょう
出来た文字列"4D546864"に対して
ループで前から2文字ずつ"&H"を付け足しているので
おそらく"&H4D&H54&H68&H64"が生成されるのでしょう

なので>>314のコードは全く意味がありません。
0323デフォルトの名無しさん (アウアウエー Sa13-c9t6)
垢版 |
2020/07/08(水) 06:49:42.97ID:yrsbI81qa
>>321> できれば、for next 構文はなしで

こんな縛りが無ければ普通にググって出てくるし以下で出来るだろうけど

複数のセルを選択する
http://officetanaka.net/excel/vba/tips/tips126.htm
0327デフォルトの名無しさん (スプッッ Sd03-Cpkm)
垢版 |
2020/07/08(水) 08:02:35.63ID:krt5VVG+d
>>326
途中で送信しちまった。
スマホで書いてるからどっか間違ってるかも。

Dim btByte() As Byte
Dim lngFN As Long

Redim btByte(5) As Byte

btByte(0)=&H4D
btByte(1)=&H54
btByte(2)=&H68
btByte(3)=&H54
btByte(4)=&H68
btByte(5)=&H64

lngFN=FreeFile
Open strPath For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN
0328デフォルトの名無しさん (スプッッ Sd03-Cpkm)
垢版 |
2020/07/08(水) 08:09:09.54ID:krt5VVG+d
>>314
というかね、Variantとは何か、Byteは何かとか考えた方が良い。
扱える範囲が違うということはメモリ上のサイズが違うということ。
6個のバイナリって6Byteのファイルってことだろ。
Variant1個で16Byteだぞ。
0329301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 09:06:02.86ID:gPwSdoJG0
みなさんレスありがとうございます。 感謝します。

>>327
ってことは、結局、↓でよいのでしょうか?


Sub test()
Dim btByte() As Byte
Dim lngFN As Long

ReDim btByte(5) As Byte

btByte(0) = &H4D
btByte(1) = &H54
btByte(2) = &H68
btByte(3) = &H54
btByte(4) = &H68
btByte(5) = &H64

lngFN = FreeFile
Open "C:\hogehoge.bin" For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN


End Sub
0330301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 09:09:44.11ID:gPwSdoJG0
あるいは、↓ですかね? ↑も↓も「Open "C:\hogehoge.bin" For Binary As #lngFN」の業でパス名が無効です、というエラーがでます。

Sub test()
Dim btByte() As Byte
Dim lngFN As Long

ReDim btByte(5) As Byte

btByte(0) = &H4D
btByte(1) = &H54
btByte(2) = &H68
btByte(3) = &H54
btByte(4) = &H68
btByte(5) = &H64

lngFN = btByte
Open "C:\hogehoge.bin" For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN


End Sub
0332301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 09:32:29.70ID:gPwSdoJG0
つか、 FreeFile関数ってのがあるんですね 知らなかったw
0333301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 09:38:09.26ID:gPwSdoJG0
じゃあ、↓のドコが悪いんだろ?

Sub test()
Dim btByte() As Byte
Dim lngFN As Long
ReDim btByte(5) As Byte
btByte(0) = &H4D
btByte(1) = &H54
btByte(2) = &H68
btByte(3) = &H54
btByte(4) = &H68
btByte(5) = &H64
lngFN = FreeFile
Open "C:\hogehoge.bin" For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN
End Sub
0335デフォルトの名無しさん (オッペケ Sra1-OOGl)
垢版 |
2020/07/08(水) 10:17:02.56ID:67N0qsNYr
>>333
「どこが悪いんだろ」
ではなく、
「下記のソースで実行すると〜というエラーが出ます。
 調べたところこのエラーの意味は〜と理解していますが、〜と修正したら今度は〜というエラーが出ます。〜〜」
と言ったように、自分でなんとか解決したいという姿勢がないとサポートなんてしたくならないよ

本当は誰も君の相手なんかしなくてもいいんだ
君は人の時間をいただこうとしてることを考えること
0337デフォルトの名無しさん (ブーイモ MMeb-+b0N)
垢版 |
2020/07/08(水) 10:37:36.28ID:vI+4Hlt3M
ハゲてきました。
市販の育毛剤で試すとエラーが出ます。
調べたところミノキシジルタブレットが聞くと理解しましたが、それを買って飲んだら今度は心臓ドキドキの副作用がでて命が危険だそうです。
どうしたらいいでしょうか?
0342デフォルトの名無しさん (ラクッペペ MMcb-0WwX)
垢版 |
2020/07/08(水) 12:08:46.81ID:lp5P2pBOM
>>341
行間を読め
0343デフォルトの名無しさん (ワッチョイ cb8e-edot)
垢版 |
2020/07/08(水) 16:22:19.40ID:0tPjVu1x0
だから最初に馬鹿はお断りしときゃいいんだよ
0344301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 17:12:58.80ID:gPwSdoJG0
つか、書き込み先を、D:\にしたら動いたwww
>>327さん、どうもありがとう!!!

こんなシンプルなソースでバイナリが書けるんです。
どんなにググッてもこんなにシンプルなソースは出て来ません。
vba史上の快挙です!

Sub test()
Dim btByte() As Byte
Dim lngFN As Long
ReDim btByte(5) As Byte
btByte(0) = &H4D
btByte(1) = &H54
btByte(2) = &H68
btByte(3) = &H54
btByte(4) = &H68
btByte(5) = &H64
lngFN = FreeFile
Open "D:\hogehoge.bin" For Binary As #lngFN
Put #lngFN, , btByte
Close #lngFN
End Sub
0346301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 17:58:35.88ID:gPwSdoJG0
>>341
midiファイルというのはサイズが決まってないんですよ
0347デフォルトの名無しさん (ワッチョイ 2de6-0WwX)
垢版 |
2020/07/08(水) 19:59:20.87ID:7XVFoSLh0
>>344
そりゃVBAではなく、VBですらなく
BASICの範疇だからな

基本過ぎてわざわざWEBに上げたりしない
0348デフォルトの名無しさん (ワッチョイ a5ae-7/eX)
垢版 |
2020/07/08(水) 20:31:33.87ID:cTUxRwdY0
>>344
死ね
0349デフォルトの名無しさん (ワッチョイ fdea-6wWl)
垢版 |
2020/07/08(水) 21:18:00.92ID:J4iDAbFT0
いつも馬鹿な質問ばかりで済みません。
Excelファイルをダブルクリックした際に他の人が先に開いていた場合、[読み取り専用]か、[通知]か聞かれます。
これをダイアログを出さずに最初から読専で開くようにすることは可能でしょうか?
(最初に開いた人は編集・保存できるという前提です)

外部から開く際のコントロールは簡単ですが、自分自身でコントロールするのは無理ですかね?
Workbook_Openでいろいろ試したのですが、どうもこのイベントよりも先にダイアログが発生しているようで、、、
無理だ、という回答でもいいです。ご意見ください。
0351デフォルトの名無しさん (ワッチョイ 2d7c-6wWl)
垢版 |
2020/07/08(水) 21:41:34.04ID:eWJ0cHmK0
>>349
まずちゃんと自分で調べよう
知識が伴ってないのにろくに調べもしないでは自分で解決どころか調べ方すら身に付かない

まぁ、はなから自分でやる気なんか無いのかもしれないが
0357デフォルトの名無しさん (ワッチョイ fdea-6wWl)
垢版 |
2020/07/08(水) 23:26:10.17ID:J4iDAbFT0
>>356
じゃあ、
>>349の繰り返しになりますが、、箇条書きにしますね。
●Excelファイルをダブルクリックした際の挙動についてです。
  ** つまり、外部から開くケースは除外です。(こちらのコントロールに苦はありません。昔から使っています)
    「外部から」とは、具体的には、、以下のケースなど。
    ・ Workbooks.Openの引数で制御する。(VBSからのOpenも含む)
    ・ ContextMenuの"新規作成"で開く。
●他の人が開いていた場合のケースです。
  ** 最初に開いている人は編集・保存ができる前提です。
    → つまり、FileAttributeを最初からReadOnlyにするケースは除外です。
●上記の際の、[読専]|[通知]を聞いてくるDialogをバイパスしたい。
  ** 「最初から読専で開きたいわけではなく、誰かが開いているときは最初から読専にしたい」
    → つまり外部から開くケースにあたらない。
● 自ファイル側で判定したい、、、Workbook_Openで試したが、このイベントより先に
  ダイアログが発生してる。

>>349とほぼ同じ内容ですが、これだけ書けばどこまでの理解で何を試したか読み取れますか?
0366デフォルトの名無しさん (ワッチョイ a58b-GkYD)
垢版 |
2020/07/09(木) 03:10:18.53ID:rHxVo6X00
IE制御のついての質問。
マクロでIE制御を使ってウェブ情報を取り込んでいるんですが、連続で作動させると稀に止まることがあります。
バグった時にタスクマネージャーの詳細をみると毎回「ielowutil.exe」のプロセスだけ残ってるんですよね。
タスクマネージャーでielowutil.exe を右クリックして強制終了させると、また上手く作動するんですが、この ielowutil.exe プロセスを強制的に終了させるコードとかないですかね。

ぐぐっても英語とか読めないのでわからない。誰か助けて
https://www.mrexcel.com/board/threads/vba-automation-error-2125463506-8150002e.1079769/
0368301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/09(木) 05:30:09.44ID:C69oBRyL0
つか、>>344のソースの

> ReDim btByte(5) As Byte
> btByte(0) = &H4D
> btByte(1) = &H54
> btByte(2) = &H68
> btByte(3) = &H54
> btByte(4) = &H68
> btByte(5) = &H64
この部分で、btByteという変数に6個の16進数を代入していますが、もっとエレガントに代入する方法はないでしょうか?
実は定型文みたいのを50個ぐらい入れなきゃならないのです。
0370デフォルトの名無しさん (スプッッ Sd93-56/R)
垢版 |
2020/07/09(木) 06:34:39.36ID:pd2EiZRKd
>>368
そういうのは、あらかじめ用意したバイナリファイルから読み込んだ方がいいと思うんだけど
どうしてもソースに大量の16進数を直接書きたいなら
配列を使う方法
h = Array(&H4D, &H54, &H68, &H54, &H68, &H64)
For i = 0 To 5
 btByte = h(i)
Next

文字列を使う方法
h = "4D,54,68,54,68,64"
For i = 0 To 5
 btByte(i) = Val("&H" & Mid(h, i * 3 + 1, 2))
Next
0371301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/09(木) 06:37:41.14ID:C69oBRyL0
>>370
ありがとうございます。 感謝します。
0374デフォルトの名無しさん (スプッッ Sd81-Cpkm)
垢版 |
2020/07/09(木) 07:48:49.30ID:3iI6FAhKd
>>368
そのエレガントな方法を考えるのがプログラミングなんじゃないの?
50個をコードでどうにかするなら、それをコードに書かにゃならんからエレガントにはならん。
別の所に持って良いなら別途ファイルを用意しとけば良い。
設定とか50個程度ならどっかのシートに書いとくとかでも良い。
0377デフォルトの名無しさん (ワッチョイ cbb0-mXGD)
垢版 |
2020/07/09(木) 10:32:17.05ID:VstlXiSO0
モジュールから単体動作する関数を切り取って、別のモジュールにコピーしたのですが
変数の宣言がないとエラー表示されました。何度見ても宣言は正しくされているので?です。
新しく変数宣言して、置き換えると動作します。
こんなことあるのですか?
0389デフォルトの名無しさん (ラクッペペ MMcb-0WwX)
垢版 |
2020/07/09(木) 18:37:42.36ID:dhOVscThM
>>376
バイナリだからウイルスって意味不明

マクロウイルスはソースが見えるからウイルスじゃないとでも言うつもりか?
0391デフォルトの名無しさん (ラクッペペ MMcb-0WwX)
垢版 |
2020/07/09(木) 18:53:47.54ID:dhOVscThM
バイナリに謎の恐怖心を持っているんだろ?

そもそも2進数じゃなくて16進数だ
0399デフォルトの名無しさん (ワッチョイ 83ee-Bqa1)
垢版 |
2020/07/09(木) 21:13:12.39ID:54FX1SKx0
Dim objShell As Object  ←値参照
Dim objExec As Object

Sub ie_kill()

Set objShell = CreateObject("WScript.Shell")    ←これなに???なんで必要なの???
Set objExec = objShell.Exec("taskkill.exe /F /IM iexplore.exe")  ←iexplore.exeをタスクキル
0405デフォルトの名無しさん (ワッチョイ 75f1-+b0N)
垢版 |
2020/07/10(金) 14:38:15.55ID:91NkPSzZ0
ExcelってChrome制御できるようになった?
0406デフォルトの名無しさん (ワッチョイ a5da-1Cui)
垢版 |
2020/07/10(金) 15:03:43.58ID:DnP9bxpW0
いまはExcelがブラウザを制御するのではなくてブラウザがExcelを制御する方向性が主流
VBAはあくまでExcel内で完結する作業に限定した言語であって外部との連携作業はOfficeアドイン(実体はJavaScriptなどのスクリプト言語)や
VSTO(VisualStdioで言語はC#が中心)で行なうのがMicrosoftの方針
Pytonはよく分からんけど上手くOfficeAPIを利用すれば出来るかもしれない
概要についてのドキュメントは>>398
0407デフォルトの名無しさん (オッペケ Sra1-OOGl)
垢版 |
2020/07/10(金) 15:20:21.38ID:TbXdOMZ+r
てゆかブラウザ操作するよりAPI叩いたりスクレイピングするほうが主流よね、今は
ずっと昔はExcelで入力してIEに反映させるとかあったけど、今じゃレガシーすぎる
0410デフォルトの名無しさん (スップ Sd43-Cpkm)
垢版 |
2020/07/10(金) 21:41:25.81ID:rd+FvU1jd
>>407
API叩くのもスクレイピングも変わらんけどな。
何でやるかの違いくらい。
まあ、Chrome制御は出来んけどな。
WebDriver使えるから出来るとも言えるか。
何処から何処迄がExcelって話。
0414デフォルトの名無しさん (ワッチョイ 75f1-+b0N)
垢版 |
2020/07/10(金) 22:39:50.15ID:91NkPSzZ0
>>413
それはちん毛ちんこケツの穴のことだ
0415デフォルトの名無しさん (ワッチョイ 2d02-aL1r)
垢版 |
2020/07/11(土) 00:41:33.92ID:vLv3KjHj0
あかん、モーむり
sendkeys使いすぎてるせいで
Numlockキーがオンになったりオフになったり・・・
かと言って必ずオンオフ切り替わるかというとそうでもないし
誰か絶対100%常にNumlockオンになるコード教えてくれえ
0416デフォルトの名無しさん (ドコグロ MM93-jxlo)
垢版 |
2020/07/11(土) 01:11:16.23ID:2VuM3xocM
>>415
vbaでレジストリを操作できるから、そこに道があるかも知れない
0421デフォルトの名無しさん (ワッチョイ 75f1-+b0N)
垢版 |
2020/07/11(土) 10:36:45.99ID:QNz3pRQ00
糞!ですか
0423デフォルトの名無しさん (スップ Sd43-Cpkm)
垢版 |
2020/07/11(土) 10:45:18.55ID:R2Hyt8Cad
>>421
Sendkeysは基本的にコントロール出来ない。
他アプリを操作するにはもっとコントロール出来る方法がある。

どうにも出来ない時は仕方がないが、絶対に使わないつもりで、どうにもならない時だけ使うべきだね。
0424デフォルトの名無しさん (スップ Sd43-Cpkm)
垢版 |
2020/07/11(土) 10:51:22.16ID:R2Hyt8Cad
あと、危険は承知でちょろっと使う時はある。
お手軽だから。

でも、それで使うことを許容すると危険もしらず、ちょろっとで済まない所で使う奴が出てくる。
0429デフォルトの名無しさん (ワッチョイ 75f1-+b0N)
垢版 |
2020/07/11(土) 13:02:10.38ID:QNz3pRQ00
糞!
0431デフォルトの名無しさん (スップ Sd43-Cpkm)
垢版 |
2020/07/11(土) 14:02:53.27ID:R2Hyt8Cad
>>430
いやいや、確かにSendkeysよりは良いけど、何でキーボードシュミレートしたいのよ。
オブジェクトに直接キーを送るとか、オブジェクトの動作そのものを実現するとかは無しか?
0433デフォルトの名無しさん (ワッチョイ a346-s8xH)
垢版 |
2020/07/11(土) 18:52:58.44ID:6knL1xMy0
あ、ちょっと失礼。
ほんの少し前、テキストボックスに入力された数式をだったか
マクロだったかをプロシージャにして実行するってなことをやってたんだが
すっかり忘れてしまいました。
どうやるんでしたでしょうか。

OS;Windows 98
Excel 97
0435デフォルトの名無しさん (ワッチョイ cb8e-edot)
垢版 |
2020/07/11(土) 20:21:11.98ID:UiWBFlGj0
>>433
死ね
0439デフォルトの名無しさん (ベーイモ MM2b-EFBW)
垢版 |
2020/07/14(火) 20:11:25.31ID:zXCz2P4SM
二つのieを起動して2つ目のieにpdfを表示させてそのpdfをexecwbのsaveasで名前をつけて保存したいのですが名前をつけて保存ダイアログに一つ目のieのファイルが保存項目として表示されてしまいます。どなたかわかる方教えてください。よろしくお願いします。

これがそのコードです getIE はシェル取得ファンクションです
長すぎると書き込めないので省略しました
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate "http://book.impress.co.jp/appended3384/4-4.html";

Dim ie2 As InternetExplorer

Set ie2 = CreateObject("InternetExplorer.Application")

ie2.Visible = True

ie2.Navigate2 "C:\\Desktop\test.pdf", 1

Set ie2 = getIE("test")

Dim test As String

test = "c:\test\test.pdf"

ie2.ExecWB OLECMDID_SAVEAS, OLECMDEXECOPT_DONTPROMPTUSER, test


End sub
0442デフォルトの名無しさん (ワッチョイ bd05-/Lr1)
垢版 |
2020/07/15(水) 05:05:59.66ID:T7WU5W0H0
Set ws1 = Worksheets(1)
Set ws2 = Worksheets(2)

n = ws2.Cells(Rows.Count, "E").End(xlUp).Row
n = n + 1

For i = 2 To ws1.Cells(Rows.Count, "A").End(xlUp).Row
j = 1

ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1

ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1

ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1

ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1

ws2.Cells(n, 5).Value = ws1.Cells(i, j).Value
n = n + 1
j = j + 1


これが10回ほど続くんですか簡潔にかけませんか?
0444デフォルトの名無しさん (ワッチョイ 5abd-brDT)
垢版 |
2020/07/15(水) 07:31:51.88ID:e63KSG0L0
再計算をオフにしていても、VlookupとかIndex/Matchで参照されているセルを削除すると初回だけ滅茶苦茶重くなる
二回目からはアンドゥしようが削除しようが一瞬になる
この初回も重くならないようにしたいんですけど、初回だけどこかで再計算か何かが裏で動いてるんでしょうか?
0447デフォルトの名無しさん (アウアウエー Sa02-l+/r)
垢版 |
2020/07/15(水) 09:01:25.32ID:yrzZGj8Ca
ちゅーちゅーちゅぶりらチュパカブラー
0449デフォルトの名無しさん (ワッチョイ 768e-3Ffi)
垢版 |
2020/07/15(水) 17:39:29.54ID:yeW9Dlh/0
>>448
そうか
頑張れよ
ここは日記お断りだぞ
0453デフォルトの名無しさん (ワッチョイ 05f9-eubO)
垢版 |
2020/07/15(水) 21:01:28.16ID:XJthZBxP0
「作りたいです」という決意表明だろ?
そう言えば誰かが勝手に手助けしてくれると思ってるのかね。
あ、本人かよ。
0454デフォルトの名無しさん (ワッチョイ 0d01-aTVc)
垢版 |
2020/07/15(水) 21:25:35.44ID:sBHz+ETb0
平成生まれと昭和生まれは少々使用する言語が違う。
同じように日本語とは言うけれど。
0456デフォルトの名無しさん (ワッチョイ 0d01-aTVc)
垢版 |
2020/07/15(水) 21:38:36.33ID:sBHz+ETb0
そこら辺は見た目の影響も大きいんだよな。
イケメンだったり可愛かったりすると、助けてもらえるのが当たり前で生きてる。

一方、ちょっと残念な感じだと、助けてもらえることが無く生きてる。

そこら辺の感じ方が違うのは当然なんだよね。
0458デフォルトの名無しさん (ワッチョイ dab5-t9FD)
垢版 |
2020/07/15(水) 22:44:18.56ID:ovUS+LpM0
覚えてものにしようと断固たる決意でマクロを完成させたけど
最初の方に組んだプロシージャを今見てもほとんど覚えてないわ
メンテナンスだけはできるようにコメントつけてあるけど
これがネットで拾い集めて基礎を学ばない相変わらずの俺のダメスタイル
0460デフォルトの名無しさん (ドコグロ MM0d-HVEE)
垢版 |
2020/07/16(木) 00:53:10.42ID:9MD/+BL5M
個数や最終行などよく使う変数名は今後の為に統一させたほうがいいな
その時の気分でいろいろと変えると後で意味不明になる
0464デフォルトの名無しさん (ワッチョイ 89cc-aTVc)
垢版 |
2020/07/16(木) 11:51:40.64ID:iXWxOn5X0
同じフォルダ内の"取引実績"ブックの"関東地区"シートのA列・B列・C列・J列・L列・AD列の
それぞれ2行目から最下行までを配列に入れる方法を教えてください

Workbooks.Open ThisWorkbook.Path & "\取引実績", ReadOnly:=True

i = Sheets("関東地区").Cells(Rows.Count,1).End(xlUp).Row

ReDim SiresakiArray(i -1, 6) As Variant
'代入するのはA,B,C,J,L,AD列のみ
SiresakiArray() = Range("A2:??????

ActiveWindow.Close
0466デフォルトの名無しさん (オイコラミネオ MMad-u33l)
垢版 |
2020/07/16(木) 12:29:13.40ID:GzNgEuWKM
みんなvbaどうやって勉強してるの?
しっかり参考書とか買って、じっくり?
ちなみに自分は>>458に近いスタイル
必要に迫られたらネットで検索して、ちょっと弄ってって感じ
だからいつまでたっても上達しない・・・
0468デフォルトの名無しさん (ワッチョイ 717c-R8z5)
垢版 |
2020/07/16(木) 12:45:12.35ID:6lIeM5zt0
コピペするだけで身に付くわけがない…
そのコードが何をしてるのか理解できるまで調べて自分で使っていれば自然に身に付く

>>464
いらん列消すか、いる列の2行目から地道に入れる
0469デフォルトの名無しさん (ブーイモ MMa1-t9FD)
垢版 |
2020/07/16(木) 13:00:26.82ID:jRyYUilTM
これできるようにしてくれない?
これって自動でならない?
職場の糞どもの質問は完全に無視してる
テメーの昼休憩にずっと触ってるスマホで調べりゃ出てくるだろ
話しかけんな
0471デフォルトの名無しさん (ワッチョイ ee8c-aTVc)
垢版 |
2020/07/16(木) 14:52:54.75ID:2egBYvX50
>>464
Sub hoge1()
Dim aa As Variant
aa = Range("a1:c3,e1:f3")
'結果:a1:c3までしか入らない。なるほどね。
End Sub


Sub hoge2()
i = Cells(Rows.Count, 1).End(xlUp).Row
ReDim siresakiarray(i - 1, 6) As Variant
retsu = Array("A", "B", "C", "J", "L", "AD")

For iic = 0 To UBound(retsu)
For iir = 2 To i
siresakiarray(iir - 2, iic) = Cells(iir, retsu(iic))
Next
Next
'
Worksheets.Add
Range("a1:m999") = siresakiarray

End Sub

一つずつ入れるならザックリこんな感じのロジックで。
他の方法として新しいシートにシートコピーして列を消して配列に挿入の方が
効率いいのかも どうだろう
0472デフォルトの名無しさん (ワッチョイ dab5-t9FD)
垢版 |
2020/07/17(金) 00:37:14.96ID:27Ma2AbZ0
少し組んで改善するとまぁ評価はされるんだけど
他の人後でメンテナンスできるよな?
とか
マクロが壊れる心配ないよな?とか

テンプレートのように言われるけど知るかよ
読み取り専用で配布してるしプロシージャ弄れないようにしてあるし壊れねーっつーの
パスワードかけてないマスター版も社内サーバーに置いてあるから
いじりたきゃ学べや

あと配布した途端楽になったらその業務ばっかりやろうとするおっさん見苦しくてむかつく
配って損したわ
0476デフォルトの名無しさん (ワッチョイ 89cc-V+qA)
垢版 |
2020/07/17(金) 11:46:31.69ID:lcXPd8bd0
配列 ary(1,6)に年月日(2020/7/18)が入っていて、配列ary(1,7)には何らかの値が入っていることがあります
ary(1,6)を20日締で起算して、ary2(1,1)に"20_7"のような文字列を返す式を教えてください。
またary(1,7)に値が入っていれば翌月にずれるようにしたいです

ary(1,6)="2020/7/18"
ary(1,7)= ""
の場合ary2(1,1)="20_7"

ary(1,6)="2020/7/21"
ary(1,7)= ""
の場合ary2(1,1)="20_8"

ary(1,6)="2020/7/18"
ary(1,7)= "値"
の場合ary2(1,1)="20_8"

ary(1,6)="2020/12/20"
ary(1,7)= "1"
の場合ary2(1,1)="21_1"
0480476 (ワッチョイ 89cc-V+qA)
垢版 |
2020/07/17(金) 15:02:49.46ID:lcXPd8bd0
>>479

完成しました。ありがとうございました



dt = CDate(ary(1,6))

If Cint(Format(dt,"d")) > 20 Then '20日以降か

dt = DateAdd("m",1,dt)

End if

  '空欄でなければさらに1カ月繰り上げる

If AfuriArray(cnt-1,26) <> "" Then

Else

 dt = DateAdd("m",1,dt)

End If

ary(2,1) = Right(Format(dt, "yyyy"),2)&"_"& Format(dt,"m")
0481デフォルトの名無しさん (ワッチョイ dab5-t9FD)
垢版 |
2020/07/17(金) 21:27:08.31ID:27Ma2AbZ0
来年の役員報告の課の改善発表の内容に
俺のマクロで作る事が既に組み込まれてるんだが
そもそもそこまでスキルないし年上のもっと給料もらってる奴にやらせろやカスが
0485デフォルトの名無しさん (ワッチョイ 89cc-sTnA)
垢版 |
2020/07/18(土) 18:26:41.44ID:6ntZQZs40
sheet"s1"にFunctionで処理したary2を貼り付けたいのですが、処理前のary1が貼り付けられます
Function後のary2を貼り付けるにはどうすればよいですか?

Sub test()
Dim endrow, r As Long
endrow = Sheets("rui").Cells(Rows.Count, 1).End(xlUp).Row
ReDim ary1(endrow - 1, 6)

ary1() = Sheets("rui").Range("A2:F" & endrow).Value
Sheets("sh1").Range("A2:F" & endrow) = ary2(ary1())
End Sub

Function ary2(ary1() As Variant) As Variant()
Dim en, r As Long
en = UBound(ary1())
For r = 1 To en
ary1(r, 1) = Application.Asc(ary1(r, 1))
ary1(r, 1) = StrConv(ary1(r, 1), vbUpperCase)
ary1(r, 1) = Replace(ary1(r, 1), " ", "")
Next r
End Function
0486デフォルトの名無しさん (アウアウエー Sa02-l+/r)
垢版 |
2020/07/18(土) 19:22:36.82ID:BZh66Ti/a
>>485
そりゃあ貴方、ary2は関数ですと自分で宣言してるもの。
しかもary1に代入してますやんかー
プログラムは命令通りに動作してるだけじゃん。

ary2の配列を準備して処理してから
そのary2の内容をシートに展開すようにプログラムしなきゃ
0489デフォルトの名無しさん (ドコグロ MM0d-HVEE)
垢版 |
2020/07/18(土) 22:50:59.73ID:GbMN9IfrM
>>485
Functionの配列渡しは少しややこしい
まずは内容を単純化して正解の型を見つけた方がいいと思う
0490デフォルトの名無しさん (ドコグロ MMc2-brDT)
垢版 |
2020/07/18(土) 23:52:10.32ID:UVKbM6jvM
>>485
単純化した一つの正解の型

Sub test()
Dim ary() As String
ary() = fnc
MsgBox ary(1)
End Sub

Function fnc() As String()
Dim ary(1) As String
ary(1) = "a"
fnc = ary()
End Function
0492デフォルトの名無しさん (ワッチョイ 768e-3Ffi)
垢版 |
2020/07/19(日) 02:51:36.02ID:b8b+mHAS0
結局、馬鹿には無理なんだよ
0496デフォルトの名無しさん (スッップ Sdfa-Kk1B)
垢版 |
2020/07/19(日) 14:09:46.91ID:4shkrYfWd
>>485
ary2の宣言部分は正しい。
でもary2の内部でary2はどうなったの?
何もしてないよね。
ary2の内部でary2はこうなりましたって書かないと宣言した時点の空の配列が返るのが当然。

つまりary2のFunctionの最後にary2=の文が必要。
0504デフォルトの名無しさん (ドコグロ MMa5-ByeJ)
垢版 |
2020/07/21(火) 11:09:54.82ID:GBbtTx0BM
VBAは過去のしがらみが多いので64bit Excelでも変な制限があってびっくりする
最近経験したのはユーザー定義型の中の配列サイズ
Type T
A(33000) As Integer
End Type
Sub S
Dim X As T
End
ってやるだけで「動的なローカル変数が多すぎます」って言われる
A(32000) As Integer
なら問題ない
0508デフォルトの名無しさん (ワッチョイ 7df1-+aB8)
垢版 |
2020/07/21(火) 14:38:12.66ID:zc+r4po80
office田中の人が顔出しでYoutubeはじめたらしいが
おじいちゃんで偉そう。
実世界なら関わりたくないタイプ。
0512デフォルトの名無しさん (ワッチョイ 6949-YsWi)
垢版 |
2020/07/21(火) 23:00:00.64ID:q3mQwKOX0
複数の同じ形式で入力されたブックをマージしたんですが、テキストを連結する場合に区切り文字を「|」にしました
(「|」は入力時には使用していません)
ファイルが3つ(A.xlsx,B.xlsx,C.xlsx)、それぞれのブックの値をa,b,c(テキストのみ、数値なし)、セルの値は
空白可だとすると、マージ後のあるセルの文字列は

a|| a|b| a||c |b| |b|c ||c a|b|c |||

のいづれかになりますが、このうち左端及び右端の「|」は削除、連続する「|」は「|」ひとつに統合、すべて「|」の
場合はセルを空白にするにはどうすればいいでしょうか?余分なスペースを削るTrimのようなことを任意の文字でしたい、
という趣旨です。処理後は以下のようにしたいです

a a|b a|c b b|c c a|b|c 空白のセル

一旦「|」をスペースに置換してTrim関数で余分なスペースを削ってから再度スペースを「|」に置換すればできるんですが、
もうちょっとスマートな方法があるのかなということと、意図して連続したスペースを入力していたらTrimで消えてしまうので
そういった場合に備える意味も含めていい方法があれば教えてください
0513デフォルトの名無しさん (ワッチョイ ee8c-sTnA)
垢版 |
2020/07/21(火) 23:08:39.79ID:aJyp0F9S0
Excel2019です
外部CSVをpowerqueryで取り込んで整形したのちシートに貼り付けてあるテーブルがありまして、
ファイルを立ち上げる度にこのテーブルを自動で更新させるところまではできました。
この後、更新完了後に自動的にCSVファイルを保存、終了させようと考えているのですが
更新完了のイベントがどうもわかりません(見当たりません)。

アドバイスをいただけないでしょうか
よろしくおねがいします。
0516デフォルトの名無しさん (ワッチョイ 812c-WQpp)
垢版 |
2020/07/22(水) 01:35:45.12ID:2/9nnKBr0
>>507
null 値は文字列型じゃなく、
型もない、または、null型だから、空文字列ではないと思う

>>513
>このテーブルを自動で更新させるところまではできました
この処理の後に、やりたい処理を書けば?
0518デフォルトの名無しさん (ワッチョイ 29f1-4Yr4)
垢版 |
2020/07/22(水) 03:16:01.58ID:hQWVf2dN0
>>517
v(^^)/~
0523デフォルトの名無しさん (ワッチョイ 0963-VaRO)
垢版 |
2020/07/22(水) 16:49:33.87ID:aRPEdkhK0
ExcelWebAddinっていうのを使ってWebフォームの入力を自動化しようとしていますが、ラジオボタンにチェックを入れるにはどのようなコマンドを入力すれば良いのでしょうか?
0524デフォルトの名無しさん (ワッチョイ 13b5-7d+j)
垢版 |
2020/07/22(水) 17:06:35.37ID:F072B1Mr0
1人だけマクロ作って超楽に終わらせてるのがバレたわ
改善提案で出して8000円賞やるから他の奴らにも配って共有化してくれと言われた
まぁ仕方ない
でもまぁマクロはこっそり作って自分で運用するに限るね
次にそういうのできたら発表で使ってくれだと
0526デフォルトの名無しさん (ワッチョイ 13b5-7d+j)
垢版 |
2020/07/22(水) 17:25:20.04ID:F072B1Mr0
Excelを使った業務が95%くらいの職場だから問題ない
逆に使いにくいwordを俺が改善で駆逐していってたが今回のはみんなに配りたくなかったけどまぁ仕方ないか…
在宅の日なんて他の人が半日かかるのを5分だったのに…
0527デフォルトの名無しさん (ワッチョイ 5173-Tayy)
垢版 |
2020/07/22(水) 17:55:11.21ID:vvOOySn70
>>524
そういうのさあ、共有してあげてもいいけど、共有すると知的障害の人が仕様の異なるものに適用して失敗して文句言ってくるのが目に見えてるんだよね
だからといっていろんなケース想定してプログラミングするのはアホらしいし
0531デフォルトの名無しさん (ワッチョイ d1e6-l24t)
垢版 |
2020/07/22(水) 20:03:08.77ID:SXXgaLVH0
オレオレ証明書でスムーズに使えるかと思ったら
証明書付けると逆に使えなくなったり
嫌がらせが半端じゃなかったしな
今では設定がどこにあるのかすら分からん
0545デフォルトの名無しさん (アウアウエー Sae3-Ar/h)
垢版 |
2020/07/23(木) 07:16:32.96ID:kdPZXO8Ra
世の中が気に入らないから
0549デフォルトの名無しさん (ワッチョイ 4901-It4W)
垢版 |
2020/07/23(木) 11:56:15.16ID:5yzO6ql90
Android版のアウトルックが操作方法また変わって、開こうとしたら削除されて、しかも削除済みのフォルダにもない。
どうしたら良いんだこれ。
メール消えてもうた。
0550デフォルトの名無しさん (アウアウカー Sa15-Ar/h)
垢版 |
2020/07/23(木) 11:58:48.40ID:qQzwkkHta
>>549
スレチ
0551デフォルトの名無しさん (ワッチョイ 4901-It4W)
垢版 |
2020/07/23(木) 11:59:14.78ID:5yzO6ql90
ロードに1分以上かかるのに、一見、ロードされているように見せかけるのも、問題があるように感じる。
人によっては、本文の無いメールが来たと思う人もいるだろう。

一見して高速にロードされるように見せかけるのは大した技術なんだろうけど、それ、ユーザーを騙すってことだよね?
実際にはクライアント側にデータを保存していないんだから。
0552デフォルトの名無しさん (ワッチョイ 4901-It4W)
垢版 |
2020/07/23(木) 12:02:50.60ID:5yzO6ql90
高速にロードされるように見せかけているがために、まだデータをダウンロードできていないことをユーザーに知らせることが出来ない。
通信中であることを示すマークを出すと、高速で無いことがバレてしまう。
ここに矛盾を抱えてる。
0553デフォルトの名無しさん (ワッチョイ 4901-It4W)
垢版 |
2020/07/23(木) 12:12:38.03ID:5yzO6ql90
しかもアウトルックドットコムはLinuxに慣れてる一般大衆からすると信じがたく重い。
サーバーからダウンロードしていることを隠すなら、高速なLinuxサーバーを使うべきでは?
0554デフォルトの名無しさん (ワッチョイ 4901-It4W)
垢版 |
2020/07/23(木) 12:24:44.89ID:5yzO6ql90
先月まで開く動作だった左にスワイプが削除の動作に代わるって、とんでもない仕様変更だよ。
0555デフォルトの名無しさん (ワッチョイ 4901-It4W)
垢版 |
2020/07/23(木) 12:26:28.82ID:5yzO6ql90
しかも、本文がロードされる前の時間帯では、削除済みのフォルダに入らない。

さすがにこれは仕様というよりバグなんじゃないのかな?
0556デフォルトの名無しさん (ブーイモ MMcb-4Yr4)
垢版 |
2020/07/23(木) 12:31:43.83ID:iL/DIdMFM
officeTANAKAのおじいちゃんの動画見てる人いる?
0560デフォルトの名無しさん (ブーイモ MM4d-4Yr4)
垢版 |
2020/07/23(木) 19:47:21.57ID:9f0mDEOaM
中田のは世界史/日本史やってるときはよかったが
範囲を広げすぎて見てるほうも興味ないしやってるほうも専門じゃないからおもしろくない
0561デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/23(木) 19:47:32.61ID:XyxsyJax0
このスレは雑談スレで質問はVBAでもビジネスsoft板スレで聞いた方がいいのかな
0562デフォルトの名無しさん (ワッチョイ 13b5-7d+j)
垢版 |
2020/07/23(木) 20:23:47.73ID:46il5rmY0
課で全員が共有する色んなExcelのファイルがあるけど
xls→たいがいマクロ組んでないからそのままマクロ組むこともある
xlsm→作成者の作ったのを見て少しだけ弄ることはある
xlsx→手を出さない
0566デフォルトの名無しさん (スッップ Sd33-Spa3)
垢版 |
2020/07/23(木) 20:52:02.29ID:i+261XKMd
>>563
プロシージャを沢山作るだろ。
その中にゃちょっとお試しのSub test1()なんてのが作られる。
で、同名のプロシージャとか作ると、色々問題が出る。
プライベートならモジュールが変われば問題無し。

そもそも、面倒くさいからわりと忘れがちだが、ちゃんとスコープや型を考えて作れない人のプログラムは出来も悪いことが多い。
バグも作りがちだね。
0572デフォルトの名無しさん (ワッチョイ d1e6-4qMj)
垢版 |
2020/07/23(木) 22:41:45.26ID:bXbPEMrj0
イベントを持った動的に生成するフォームはクラスでやるしかないのでは
と、思うのだが(´・ω・`)違ったらごめんね
クラスなんか要らない構造体で十分って言ってる奴、知的好奇心足りなさすぎでは
0573デフォルトの名無しさん (スッップ Sd33-Spa3)
垢版 |
2020/07/23(木) 23:49:06.55ID:i+261XKMd
>>572
VBEにメニュー追加して、メニュー押した時のイベントにはクラスが必要だね。

VBAはクラス使わなくても組める言語だけど、時々クラスがピッタリ来る場合がある。
そういう場合はクラス使った方がメンテナンス性とか後々良いことがある。
0575デフォルトの名無しさん (ワッチョイ d901-s6lF)
垢版 |
2020/07/24(金) 07:38:12.69ID:kDVWriuI0
クラスの意味はわかるけど使うメリットがようわからんな
for eachで回せるくらいしか思い浮かばないんだが…
javaチックに全部クラスで作るのもなんか違う気がするし
0583デフォルトの名無しさん (ワッチョイ 4901-7yLj)
垢版 |
2020/07/25(土) 00:45:14.24ID:JvyY8SZI0
クラスのメソッドで例外が起きた時、メソッド内の発生場所で止まるようにする方法はありませんか?
標準モジュール内のメソッドを呼んだ位置まで巻き戻って停止してしまい、デバッグしづらいです。
0587デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/25(土) 03:52:26.30ID:ajAv/KNZ0
こことPythonのスレはどうしようもない馬鹿が来るよな
0588デフォルトの名無しさん (ワッチョイ 2940-7yLj)
垢版 |
2020/07/25(土) 10:50:18.42ID:JW+blTJS0
>>584
説明不足だったかもしれません。

標準モジュール内で例外が投げられると、発生した行の色が変わって停止します。
これをクラスのメソッド定義の中でもできるようにしたいんです。
0593デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/26(日) 00:01:52.46ID:YUJGnmE80
シェルで使うスクリプト
0595デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/26(日) 00:58:59.92ID:5SabrGL+0
馬鹿は勝手な略語を使う法則
0596デフォルトの名無しさん (アウアウエー Sae3-Ar/h)
垢版 |
2020/07/26(日) 01:28:13.97ID:PahVuP8ha
「Excel」とはマイクロソフト社が販売する代表的なコンピューター上で動作する表計算アプリケーションソフトウェアのひとつです。

「VBA」とは
(コンピュータ用語)で
読み方は【ぶいびーえー】と読みます。
VisualBasic for Applications【ぶぃじゅある べいしっく ふぉー あぷりけいしょん】の略です。
マイクロソフト社製の各Office製品に附属しています。
それぞれのアプリケーション(Excel、Accessなど)の操作に特化したVisualBasicの亜種です。

「質問」とは質疑問い合わせの事です。

「スレ」とはスレッドの略で掲示板のプロセス単位の事です。

「part」とは・・
0600デフォルトの名無しさん (ワッチョイ 1301-8Xcr)
垢版 |
2020/07/26(日) 11:21:54.14ID:Jda+4IKu0
Cells(1, 1)に、5Fという文字が書かれてます。
Cells(1, 1)から、Dim b As Byte と宣言されたbにバイナリデータの5Fを代入するにはどうすればよいでしょうか?
↓を実行すると、b = Cells(1, 1).Valueのところで、「型が一致しません」となります。

Sub test()
Dim b As Byte
b = Cells(1, 1).Value
Debug.Print b
End Sub
0602デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/26(日) 11:28:35.60ID:5SabrGL+0
また馬鹿が戻ってきたか
0603600 (ワッチョイ 1301-8Xcr)
垢版 |
2020/07/26(日) 11:31:04.04ID:Jda+4IKu0
>>601
おお、ありがとうございます。 出来ました!
0605デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/26(日) 11:36:23.90ID:5SabrGL+0
>>604
midiでスレを検索しろ
全部丸投げで作って貰おうとしてる厚かましい馬鹿だ
0610デフォルトの名無しさん (ワッチョイ b9df-h1M8)
垢版 |
2020/07/26(日) 18:16:36.02ID:jictETsT0
5チャンネルはくだらない質問をすると、
張り倒されてぼこぼこにされて簀巻きにされて東京湾に沈められると聞いたので

がくがくしながら質問しています。
ちょぅとだけ質問していいですか?


Sub Main()
 Dim RowCnt As Long
 
 With ThisWorkbook.Sheets(1)
  RowCnt = 2
  Do
   If .Cells(RowCnt, 1).Value = "" Then Exit Do
   .Cells(RowCnt, 2).NumberFormatLocal = "@"
   .Cells(RowCnt, 2).Value = GetISBN(.Cells(RowCnt, 1).Value)
   RowCnt = RowCnt + 1
  Loop
 End With

についておしえてください。
0611デフォルトの名無しさん (ワッチョイ b9df-h1M8)
垢版 |
2020/07/26(日) 18:57:11.06ID:jictETsT0
間違えたここまでだった。

Sub Main()
 Dim RowCnt As Long
 
 With ThisWorkbook.Sheets(1)
  RowCnt = 2
  Do
   If .Cells(RowCnt, 1).Value = "" Then Exit Do
   .Cells(RowCnt, 2).NumberFormatLocal = "@"
   .Cells(RowCnt, 2).Value = GetISBN(.Cells(RowCnt, 1).Value)
   RowCnt = RowCnt + 1
  Loop
 End With
 
 amazonSearch2
 
End Sub
0614デフォルトの名無しさん (スッップ Sd33-VaRO)
垢版 |
2020/07/26(日) 20:22:52.99ID:OH794sXtd
馬鹿ばっか
0616デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/26(日) 20:53:16.35ID:YUJGnmE80
>>611
他にも続きがたくさんあるでしょ
全部のせないとわからない
0618610・611 (ワッチョイ b9df-h1M8)
垢版 |
2020/07/26(日) 21:34:20.58ID:jictETsT0
他の掲示板で質問しているのでマルチポストになるとぶん殴られると聞いたので、
こっそりとしか質問できないので、、、

こっそり質問してます。(`・ω・´)

'Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
を64bitEXCEL(vba)で動かすためには、API宣言を変えないとダメだと聞いたのですが、

#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If

に変えてみたのですが、
実行時エラー'91':
オブジェクト変数またはWithブロック変数がしていされていません。

と出てまたダメでした。

どうすりゃいいですかね?
0619デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/26(日) 21:43:35.53ID:F4Iawv3Z0
>>618
内容理解してないだろ
馬鹿かよ
0622デフォルトの名無しさん (ワッチョイ d9da-5TCi)
垢版 |
2020/07/26(日) 23:53:25.41ID:FG7uH+9S0
>>610(たけし)は、本当はたけしじゃなくてタケルなのに、
お前たけしだろ!って言われて困惑している状態。

#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
つまり
0623デフォルトの名無しさん (アウアウエー Sae3-Ar/h)
垢版 |
2020/07/27(月) 04:00:49.04ID:AjWs5F06a
スレチ
0625デフォルトの名無しさん (ワッチョイ 8bcc-5TCi)
垢版 |
2020/07/27(月) 17:43:54.17ID:uXQw94U/0
可能だよ
WorkSheetのBeforeDoubleClickイベントを使う
Deleteメソッドではないことに注意
それとは別に、普通にメソッドを実行するとUndoできなくなって危険だから、Sendkeysとか使った方がいいかも
0627デフォルトの名無しさん (ワッチョイ 4149-5TCi)
垢版 |
2020/07/27(月) 19:20:33.66ID:Tsc1/eGu0
>>512 512です
>>517さんの正規表現が私の理解不足でうまく使えなかったため>>522さんのやり方で下記のコードを書きました。1ファイル100列×500行程度のものを3つマージした後で置換するのは問題なかったのですが、5つのファイルをマージ後に置換したところエラー6のオーバーフローが発生し、8行目の「r = Reg.Replace(r.Value, "|")」の行がハイライトされていました
Dim r As RangeをDim r As Variantにしてみても解決しなかったのですが、これは検索対象の文字数が多すぎてオーバーフローになるのでしょうか。また対策があれば教えてください、よろしくお願いします(改行が多いと書き込めないため見づらくてすみません)

Dim Reg
Dim r As Range
Set Reg = CreateObject("VBScript.RegExp")
With Reg
.Pattern = "\|+" '検索パターン 連続した「|」
.Global = True '文字列全体を検索
For Each r In ActiveSheet.UsedRange
r = Reg.Replace(r.Value, "|") '「|」ひとつに置換
Next r
End With
With Reg
.Pattern = "^\|" '検索パターン 先頭の「|」
.Global = True
For Each r In ActiveSheet.UsedRange
r = Reg.Replace(r.Value, "") '削除
Next r
End With
With Reg
.Pattern = "^|$" '検索パターン 末尾の「|」
.Global = True
For Each r In ActiveSheet.UsedRange
r = Reg.Replace(r.Value, "") '削除
Next r
End With
Set Reg = Nothing
0630デフォルトの名無しさん (ワッチョイ d901-s6lF)
垢版 |
2020/07/27(月) 20:53:58.84ID:MCUd8BVw0
typeって使うとなんかいいことある?
少しずつパラメータは違うけど処理が同じのを何回もやらなきゃならなくて
Rengeでベタうちの方が後で見てもわかりやすいんだけど
そうすると少しずつ違う処理を全部作らないといけないんだよなあ
かと言って変数で共通化するとわかりにくくて後でメンテが大変そうでさあ
継承とかあればいいのに
0632デフォルトの名無しさん (ワッチョイ 8b10-8Xcr)
垢版 |
2020/07/27(月) 23:06:24.84ID:FGdyWgnW0
VBAマクロの質問になりますが、
Webブラウザ上で検索した結果、10件ごとに1ページずつ結果がされた後に、
マクロから2ページ目に遷移する為の"2"のボタンを押したいのですが、
ソースコードの表示でhtml上に2のnameやtypeが表示されない為、マクロから2ページ目以降を自動的にクリックできません。
どなたかお教え願います
0633デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/28(火) 00:05:21.07ID:S0kilWhd0
ボタンを検索してそれが"2"やったら押したらええんやで
0635デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/28(火) 00:22:36.19ID:S0kilWhd0
vba dom ボタン でググった最初のサイトに書いてるやないか
0637デフォルトの名無しさん (アウアウエー Sae3-Ar/h)
垢版 |
2020/07/28(火) 00:25:17.81ID:p8KDyqHYa
絶対に押すな!ってコメント書いとけばいいんじゃない?
0639デフォルトの名無しさん (ワッチョイ d1e6-l24t)
垢版 |
2020/07/28(火) 00:31:40.60ID:572xGNLz0
違うよ、クリックされたときのイベントハンドラを知るべきだよ
0640デフォルトの名無しさん (ワッチョイ 8b10-8Xcr)
垢版 |
2020/07/28(火) 00:32:32.93ID:blBd/uyT0
VBAからchromeを起動して、googleでセルから拾ったwordの"りんご"を検索結果で表示させ、
htmlのソースコードが見れない状態で、2ページ目に遷移するボタンをクリックする方法になります
0641デフォルトの名無しさん (ワッチョイ d1e6-l24t)
垢版 |
2020/07/28(火) 00:39:14.92ID:572xGNLz0
見ろよ
0643デフォルトの名無しさん (スプッッ Sd73-Spa3)
垢版 |
2020/07/28(火) 08:00:54.71ID:cRv8WCzbd
>>627
Dim r As Variantにしても解決しなかったって、どうしてそれで解決すると思ったの?

というか、何でそんな頑張り?
Dim r As Range
Dim strData As String
Dim lngLen As Long

strData=r.Value
Do While lngLen<>Len(strData)
lngLen=Len(strData)
strData=Replace(strData,"||","|")
Loop
If Left(strData,1)="|" Then
strData=Mid(strData,2)
EndIf
If Right(strData,1)="|" Then
strData=Left(strData,Len(strData)-1)
EndIf

通勤中にスマホで書いたから試してないが、こんな感じでいけない?
0644デフォルトの名無しさん (スプッッ Sd73-Spa3)
垢版 |
2020/07/28(火) 08:08:15.26ID:cRv8WCzbd
>>640
ChromeでやるならSelenium系の話になるだろう。
IE系ならInternetExplorer.Application使ってできる。

属性については、Id、name、classnameあたりが無いならgetElementsByTagname使ってタグの何番目とか、そのオブジェクトの親、さらにその親あたりをId、name、classnameあたりで取得して、childnodesの何番目とやる。
0645デフォルトの名無しさん (ワッチョイ b9cb-wJn/)
垢版 |
2020/07/28(火) 16:38:18.39ID:1uHtckRe0
ワークシートに下記のコード書いたときには動作するんですが、標準モジュールに書いたときには動かないのはどうすればいいでしょうか?
やりたいことは、「NG」という文字があったときは、結果に「未」を、「済」の場合は、その時の列の名前を結果に表示したいです。すべて「済」なら「完了」と表示するという意図のコードです。

https://i.imgur.com/CcGQxwO.jpg


Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Dim intR As Integer,intC As Integer,strW As String,LastCol As Integer

intR = Target.Row
intC = Target.Column
strW = Target.Text
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column
If intR >= 3 And intC >= 3 Then
Select Case strW
Case "NG": Cells(intR, 2) = "未"
Case "済"
Select Case intC
Case Is = LastCol: Cells(intR, 2) = "完了"
Case Else: Cells(intR, 2) = Cells(1, intC)
End Select
End Select
End If
Application.EnableEvents = True
End Sub
0647デフォルトの名無しさん (ワッチョイ 132f-oJ29)
垢版 |
2020/07/28(火) 17:11:42.28ID:LXXezy4S0
そりゃ標準モジュールではイベントは発生しないからな
処理そのものは標準モジュールにサブルーチン(つか言い方が古いw)として定義してもいいけど
イベントそのものはイベントが起こるところで拾って呼び出せ
0654デフォルトの名無しさん (ワッチョイ 4149-5TCi)
垢版 |
2020/07/28(火) 23:43:33.18ID:7SbfIR+a0
>>643
ありがとうございます
教えていただいたコードで試してみました
そのままだと実行時エラー91になり「strData = r.Value」がハイライトされ、
「Set r = ActiveSheet.UsedRange」を足したところ実行時エラー13型が一致しません
となってやはり「strData = r.Value」がハイライトされたので
「For Each r In ActiveSheet.UsedRange 〜 Next」を足したところエラーは表示されず
ローカルウィンドウ上では「|」が置換されていくのですが、実際のセルの文字列は
置換されませんでした。これは何が問題なのでしょうか

Sub test()
Dim r As Range
Dim strData As String
Dim lngLen As Long
Set r = ActiveSheet.UsedRange
For Each r In ActiveSheet.UsedRange
strData = r.Value
Do While lngLen <> Len(strData)
lngLen = Len(strData)
strData = Replace(strData, "||", "|")
Loop
If Left(strData, 1) = "|" Then
strData = Mid(strData, 2)
End If
If Right(strData, 1) = "|" Then
strData = Left(strData, Len(strData) - 1)
End If
Next
End Sub
0658デフォルトの名無しさん (ワッチョイ d610-1vA1)
垢版 |
2020/07/29(水) 01:00:46.72ID:X5Dn8QJR0
>>644
ありがとうございます

objIE.document.GetElementsByTagName("タグ名")(添え字)

上記の構文で該当のページに自動クリックするようになったのです

For p = 1 to 10
objIE.document.GetElementsByTagName("タグ名")(p)
Next p

上のような構文で最初は2ページにきちんと遷移するのですが、次は4ページ、次は2ページ、次は3ページと
うまくページ遷移が出来ません。
一応MsgBoxでpを参照すると1〜10の数字は格納されてるみたいなのですが
objIE.document.GetElementsByTagName("タグ名")(1)で2ページ目
objIE.document.GetElementsByTagName("タグ名")(2)で4ページ目
objIE.document.GetElementsByTagName("タグ名")(3)で3ページ目

上記のように変数の数字と同じページに進んでくれない処理になります。
For文を使用してインクリメントするのではなく、表示させたいページとそれに対応する添え字で処理をしてくしか方法はないのでしょうか
0660デフォルトの名無しさん (ワッチョイ 7a01-he4x)
垢版 |
2020/07/29(水) 13:22:46.34ID:mS6Tz06p0
本社が作って社内システムにアップロードされてるVBAマクロが
マクロの記録をつなぎ合わせて作った酷いコードでつらい・・・
連続した1000行*5列ぐらいのコピペするだけなのにVBE50行ぐらい使っててつらい・・・
0661デフォルトの名無しさん (スプッッ Sd7a-u4+4)
垢版 |
2020/07/29(水) 13:57:55.28ID:MurrSo1vd
>>657
まず、最初の方にあるSet r = ActiveSheet.UsedRangeは意味が無いし、必要無い。
rはFor文の中でUsedRangeの中の1つ1つのセルを巡っていくのであって、UsedRangeそのものじゃない。

次に、元々のプログラムでも思ったのだが、書ける人は文字列を与えると変換する関数を作ることを考える。
それさえ出来てしまえばrにそれを与えるだけ。
Private Sub test()
Dim r As Range
For Each r In ActiveSheet.UsedRange
r.Value=ConvertString(r.Value)
Next
End Sub
Private Function ConvertString(strData As String) As String

Dim lngLen As Long
Do While lngLen<>Len(strData)
lngLen=Len(strData)
strData=Replace(strData,"||","|")
Loop
If Left(strData,1)="|" Then
strData=Mid(strData,2)
EndIf
If Right(strData,1)="|" Then
strData=Left(strData,Len(strData)-1)
EndIf

ConvertString=strData

End Function
0662デフォルトの名無しさん (スプッッ Sd7a-u4+4)
垢版 |
2020/07/29(水) 14:31:44.31ID:MurrSo1vd
>>658
クリックする命令が無いが、For文の中でクリックしているとして、

1.そのpの1〜10が正しく遷移出来るリンクのあるタグかどうか?

2.一旦、遷移したら場合にもよるがobjIEは遷移後のページになる。
とすれば、Document以下のソースが遷移後のぺージのソースになる。

3.遷移には時間がかかるが、それをきちんと待つことが考慮されている?

ぐらいは気になるね。
0663デフォルトの名無しさん (ワッチョイ 99cc-UdrD)
垢版 |
2020/07/29(水) 15:27:30.52ID:6iCm/sfN0
配列ary2の重複を削除して配列ary3にいれたいのですが
実行後ary3の値はすべて空欄になってしまいます
ary2には全て値が入っています

Option Base 1
Sub Test4()

Dim EndRow, cnt, cnt2 As Long
Dim flg As Boolean

EndRow = Cells(Rows.Count,1).End(xlUp).Row
ReDim ary2(EndRow)
ReDim ary3(EndRow)
0664663 (ワッチョイ 99cc-UdrD)
垢版 |
2020/07/29(水) 15:28:20.62ID:6iCm/sfN0
↓続きです

For cnt = 1 To EndRow 'ary2に値は入っています
ary2(cnt) = Cells(cnt,1)
End cnt

For cnt = 1 To UBound(ary2)
flg = False
For cnt2 = 1 To UBound(ary3)
If (ary2(cnt) = ary3(cnt2)) Then
flg = True
Exit For
End If
Next cnt2

If (flg = False) Then
ary3(UBound(ary3)) = ary2(cnt)
ReDim Preserve ary3(UBound(ary3) + 1)
End If
Next cnt

End Sub
0668663 (ワッチョイ 99cc-UdrD)
垢版 |
2020/07/29(水) 18:28:53.19ID:6iCm/sfN0
>>665
勉強になりました。ありがとうございます

>>666
ご指摘の通りでした。ありがとうございます

>>667
確認しましたが、すべてのcntの時にary3が空になってしまっていました
0671デフォルトの名無しさん (ラクッペペ MMee-LxoB)
垢版 |
2020/07/29(水) 19:38:04.93ID:/vJCggp/M
書いたやつに聞けよ
0673デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 09:11:02.16ID:G1iLlMLAH
VBAの知識0なんですけど
・1000円以上買うごとに1口
・1ヶ月感の累計購入金額総額で抽選
この条件で最大300人に当たるキャンペーンやりたいんだけど
これをVBAで動かして抽出するのにどれくらいの手間がかかりますか?

口数は1人あたり0口から5000口(最大500万円想定)
対象人数は最大2万人を想定してます

ランダム関数でなんとか無理やり組もうとするとデータ多すぎてメモリたんなくなる・・・
0676デフォルトの名無しさん (ラクッペペ MMee-LxoB)
垢版 |
2020/07/30(木) 09:23:42.54ID:JMS2FJh9M
一口ごとに1枚プリントアウト。この時なるべく小さい紙に印刷するのがポイント!
後は紙を穴の空いたボックスに詰めて目隠しした担当者が300枚を抜き出す
0677デフォルトの名無しさん (ワッチョイ 7a01-he4x)
垢版 |
2020/07/30(木) 09:36:09.05ID:tHevDqCo0
個人の氏名ごとに口数記録するじゃんね
口数の合計値をlongにいれるじゃんね
longの最大は21億〜だからいけるじゃんね
んでその合計値が例えば20万だったら
20万の中からRandomをうまいこと使って300個の数字を抽出すればいいだけじゃんね
各数字は氏名ごとに記録した口数を上から合計したときの数値と一致するわけじゃんね
簡単じゃんね
0678デフォルトの名無しさん (ワッチョイ 7a01-he4x)
垢版 |
2020/07/30(木) 09:43:40.24ID:tHevDqCo0
抽出するには、いろんな方法あるけど
位ごとに数字を選ぶみたいなのでもいいじゃんね

例えば合計値が232,984口だったとしたら
10万の位→2,1,0から1つえらぶ
1万の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
千の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
百の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
10の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
1の位→9,8,7,6,5,4,3,2,1,0から1つ選ぶ
これで1つの数字ができる
これを300回繰り返すんだけど
0になったり、重複したりしたら無効でやり直しするじゃんね
0680デフォルトの名無しさん (ドコグロ MM9a-Fc3l)
垢版 |
2020/07/30(木) 09:48:09.38ID:P52O6TU4M
おまえら食いつきがいいな
0681デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 09:51:09.03ID:G1iLlMLAH
最初口数だして横に5000まで数字並べて
IF(1〜5000<口数,RAND(),"")って全部のセルに埋めてたら
20000×5000の関数が動くからフリーズして困ったんだよね・・・

これをやったあとMAX関数で一番でかい数字引っ張ってきて
それをソートして上から300人ってすれば重複当選もないし問題ないかと思ってた

まさか4〜500万購入ユーザーがいるなんて聞いてなかったから気軽に引き受けちゃったよ・・・
0682デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 09:53:13.58ID:G1iLlMLAH
取り敢えず2万人の口数を順番に足していったリスト作って
合計数からランダムに300個抜き出して
それを作ったリストと照らし合わせればいいのか
サンクス、突破口見えた気がする

VBAじゃなくてもいいのか・・・ありがとう
0684デフォルトの名無しさん (ワッチョイ d540-Y3wz)
垢版 |
2020/07/30(木) 10:27:51.92ID:EC4xcxw30
>>673
A列に人の名前なりIDなり入れる
B列に口数
C列は当選番号の割り振りで、C1はB1の値、CnはC(n-1)+Bnとし、C(n-1)+1〜CnがAnの当選番号
これと独立して300回ランダム*全口数+1で当選番号300個を作る
それを1つずつ誰のものか確認して当選者とする
0686デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 11:11:00.39ID:G1iLlMLAH
この方式だと重複当選しちゃうな・・・
2〜3回繰り返して重複当選除外してやるかいね
どうせ1回しかやらんし
0689デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 11:58:26.01ID:G1iLlMLAH
複数当選してしまうと総額が景品表示法に引っかかってしまうんですよ・・・
0690デフォルトの名無しさん (ワッチョイ ce8c-UdrD)
垢版 |
2020/07/30(木) 12:09:03.16ID:LgbrNaJ+0
>>673
A列に個人名(もしくは個人コード)
B列に1回の購入金額

この形式で基礎データをもらえるものだと思っていいの?
0691デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 12:11:02.85ID:G1iLlMLAH
>>690
ユーザーIDと期間内の累計購入金額は貰えます
手元に前年同月のデータもあります
0692デフォルトの名無しさん (ワッチョイ 79ce-Xvfy)
垢版 |
2020/07/30(木) 12:18:53.15ID:AlO/S9Es0
>>689
その場合、複数応募者は口数に比例して当選確率を上げるアルゴリズムにしないと公平にならないけど
正直にやるか、手を抜いて全員の確率を同じにするかは運営側の気持ち次第
0695デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 13:20:10.92ID:G1iLlMLAH
VBAの基礎を学んで言われたことを遂行するための知識を得るための手間かな・・・ほんと知識0なんで必要ならこれを機に手を出してみようかなと
0697デフォルトの名無しさん (ワッチョイ 7a01-he4x)
垢版 |
2020/07/30(木) 13:59:59.21ID:tHevDqCo0
ビール飲みながらすげー適当に組んでみたんだけどあげちゃだめなの?
てかコード貼ったら使えるレベルなん?
うちの3世代ぐらい前のi5のPCで300件で5分ぐらいかかりそうな感じだけど
0699デフォルトの名無しさん (オッペケ Sr05-/T2I)
垢版 |
2020/07/30(木) 14:18:10.19ID:vzRw0yWJr
>>658
回答頂きましてありがとうございます

再度の質問になえうのですが

getelement.所属クラス.getelementbytagname("a")(インクリメント変数).length -1
messageボックスでouterhtml出力

上記で取得されてる要素を参照すると
1の時、label=page1 何だかcheck=true
2の時、label=page2 何だかcheck=false
3の時、label=page1 何だかcheck=false
4の時、label=page4 何だかcheck=false
5の時、label=page3 何だかcheck=false

上記のような要素取得がなされており、番号順にページ遷移がなされてないことがわかりました

タグ以外にラベルやタイプ等で特定要素を抽出する方法はありませんでしょうか
0704デフォルトの名無しさん (スッップ Sd9a-nhZs)
垢版 |
2020/07/30(木) 15:36:31.06ID:keIwCUAVd
perl,pythonスレに続く釣りなのかね?
0705699 (オッペケ Sr05-/T2I)
垢版 |
2020/07/30(木) 15:36:51.50ID:THFUAhsVr
innertextでクラス配下のaタグの行を1つずつ抽出でfor eachでページ番号のラベルに引っ掛けて処理するっていうのは可能でしょうか
0706デフォルトの名無しさん (オッペケ Sr05-/T2I)
垢版 |
2020/07/30(木) 17:31:34.81ID:THFUAhsVr
すいませんある程度自己解決しましたが、取得した要素にouterhtmlで抽出したところ番号順にタグ情報が取得出来たのですが、outerhtmlに続けて.clickだとエラーになります
一旦変数に格納しないとクリック出来ませんでしょうか
0708デフォルトの名無しさん (ワッチョイ d610-1vA1)
垢版 |
2020/07/30(木) 23:18:28.10ID:i0KpmXdS0
>>707
すいません

Dim table_date As MSHTML.HTMLDocument

上の宣言でまずouterhtmlの取得要素を格納する変数を宣言する必要があると思いますが
ユーザー定義型エラーが出てしまい、調べたところ参照設定で[Microsoft HTML Object Library]を有効にしないと使えないという事ですが、
上記のHTMLDocumentオブジェクトで宣言したマクロを他のPCのエクセルでも使用する場合、イチイチ参照設定を有効にしないと使えないのでしょうか

あともう1つの質問になりますが、

table_date = getelementclass(objie,"所属class名").outerhtml

上記でまず対象のタグが所属するclassの全要素を変数に格納したあと

for i = 0 to 10
table_date.getelementsbytag("a")(i).click
next

変数に格納されたhtml文のaタグ要素を一行ずつ取り出してボタンクリックしたいのですが、
この構文で可能でしょうか
0710デフォルトの名無しさん (ワッチョイ d68e-nhZs)
垢版 |
2020/07/31(金) 00:01:53.71ID:sBpjKr+V0
>>708
そろそろ死ねよ
0712デフォルトの名無しさん (ワッチョイ 4102-UD9X)
垢版 |
2020/07/31(金) 07:35:13.13ID:Seq7lwgB0
ソルバーを使おうと思ってまずは機能するか簡単なものを作ってみたんですが、
与える値によって解があるにも関わらず機能したりしなかったりするんですが何がおかしいのでしょうか
A2 9
A3 15
A4 30
B2 空白
B3 空白
B4 空白
C2 =SUMPRODUCT(A2:A4,B2:B4)
として、値45で実行すると正しく解が見つかるのですが
値60で実行すると解が見つけられないのです。
45の場合
https://i.imgur.com/eAOJ9Ju.jpg
https://i.imgur.com/eCc0hFi.jpg
60の場合
https://i.imgur.com/t2CqGfo.jpg
https://i.imgur.com/lNC6CDZ.jpg
0713デフォルトの名無しさん (アウアウエー Sa22-DfbS)
垢版 |
2020/07/31(金) 08:36:27.75ID:BJAFpQuia
>>712
は?ちょと、なに言ってのかわからない
何もおかしくないじゃない!?
ちゃんと54て出てんじゃん!
0717デフォルトの名無しさん (ワッチョイ 7a4f-1TqB)
垢版 |
2020/07/31(金) 12:28:54.85ID:TQ16TWaV0
質問です
シェイプを回転させたくて
シェイプのRotationX,RotationY,RotationZを弄ってみたのですが、
Z軸は上手く行くのですが、X軸、Y軸はその軸に併せて縮小するだけで全く奥行きが出ません。

これは設定するプロパティが足りないのでしょうか?
それともこういうものなんでしょうか?
0719デフォルトの名無しさん (ワッチョイ 4102-UD9X)
垢版 |
2020/07/31(金) 20:02:27.14ID:Seq7lwgB0
>>713-714
エクセルに問題がないなら問題があるのは私ということで考えてみたら
与えた命令を根本的に勘違いしていたみたいです
同じ値を複数回選択することもできると思っていました
もともと想定していた目的には問題なく使えますし、
もし複数選択させたい場合は同じ値を複数入れて対応します
スレ違いにも関わらず温かくご回答いただきありがとうございました

>>715
スレ違いだったみたいで申し訳ないです
ご迷惑おかけしました
0720デフォルトの名無しさん (ワッチョイ 65da-xE3T)
垢版 |
2020/08/01(土) 08:39:00.72ID:kuObS2ra0
>>717
透視投影?
確かにマクロの自動記録でもそこだけ変わらないな。

しかしこれ何に使うんだろうな。
重すぎてポリゴンゲーは作れないしな。
スターフォックスレベルでも無理だろ。
0727デフォルトの名無しさん (アウアウカー Sa5d-DfbS)
垢版 |
2020/08/01(土) 11:39:41.69ID:biQ1QRTHa
>>717の目的は
【シェイプを回転させたくて 】
なので回転出来るんだからそれで達成できてる
0728デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/01(土) 11:47:14.76ID:bRba9mah0
エクセルを禁止しないと日本のITは韓国に追いつけない。

エクセルのせいで数学がわからない子供たちが増えている。

Ubuntuを使うべき。
0731デフォルトの名無しさん (アウアウカー Sa5d-DfbS)
垢版 |
2020/08/01(土) 12:29:20.74ID:biQ1QRTHa
ソロバンから電卓に代わってもそうゆう人って一定数いるよね
小学生からExcel使えるなら
FAXで集計してるコロナ関係者よりマシ
0733デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/01(土) 12:49:17.09ID:bRba9mah0
小学生のIT教育でUbuntuのインストールを教えるべきでは?
0734デフォルトの名無しさん (アウアウカー Sa5d-DfbS)
垢版 |
2020/08/01(土) 12:59:14.62ID:biQ1QRTHa
すいませんすみませんあーざーっす
「なんで、そーゆーこと言うの?」さおいふ
オッハーマヨチュチュ
タイガーアッパっパー
「こちらの方でよろしかったですか?」
「おにぎり温めなかったほうで大丈夫ですか?」
「お買い物袋はお持ちでありませんでかまいませんか?」
0736デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/01(土) 13:04:03.06ID:bRba9mah0
UbuntuはスパコンのOSにも使われているので、数学に強いです。

エクセルは禁止にするべきです。
0738デフォルトの名無しさん (ワッチョイ d6b3-UD9X)
垢版 |
2020/08/01(土) 17:35:39.71ID:l0aqZI9e0
マクロ実行ボタン1を押すとマクロ実行ボタン1が消えて
新しいマクロ実行ボタン2が出現。ボタン2を押すとマクロ実行ボタン3が出現するような
繰り返し動作を行いたいのですが可能でしょうか?
コードを教えていただきたく、よろしくお願いします。
0740デフォルトの名無しさん (ワッチョイ 7aef-xE3T)
垢版 |
2020/08/01(土) 18:55:56.93ID:7hgxy1yb0
>>738
少し違うけど、こうした方が楽

With マクロ実行ボタン
Select Case .Caption
Case "マクロ実行ボタン2"
マクロ2
.Caption = "マクロ実行ボタン3"
Case "マクロ実行ボタン3"
マクロ3
.Caption = "マクロ実行ボタン1"
Case Else
マクロ1
.Caption = "マクロ実行ボタン2"
End Select
End With
0746デフォルトの名無しさん (テテンテンテン MMee-DfbS)
垢版 |
2020/08/02(日) 04:27:47.15ID:yz3gxwYFM
ラウンドワンとかゲームセンターに置いてある
「動体視力ゲーム」みたいなのじゃないの?
数字ボタンがランダムな位置に出現して
押したら次のボタンが別の位置に現れるヤツ
0747デフォルトの名無しさん (ワッチョイ 4e06-LqCg)
垢版 |
2020/08/02(日) 12:51:46.72ID:i29UoGb/0
>>673
エクセルのほうが簡単だと思います。
A列:1〜20000までの連番
B列:口数
C列:∔B1/B列合計 (以下コピー)
D列:1行目は0、2行目 +C1、3行目以降は=+D2+C2をコピー
E列:+A1(以下コピー)
F列:=RAND()(以下コピー)
G列:=VLOOKUP(+F1,D$1:E$20000,2)を300行目までコピー
300/20000なら大口がいないと重複しなさそう。
重複があったらシートコピーして当選行を削除。
0749デフォルトの名無しさん (ワッチョイ 4e06-LqCg)
垢版 |
2020/08/02(日) 14:04:53.69ID:i29UoGb/0
ベースモデル考えて確率的に速い手段を選ぶだけ。
コード書くのが好きなら計算結果を配列に入れて、既定カウントに達するまで回せばいいけど、時間の無駄。
0754デフォルトの名無しさん (ワッチョイ 5d01-UD9X)
垢版 |
2020/08/02(日) 22:26:59.52ID:RZU5Rxbr0
>>747
A列:連番
B列:口数
C列:当選確率 = 口数/口数の合計
D列:点数 = 当選確率*RAND()
これでソートかけたほうが簡単じゃね
300番付近のボーダーラインで点数の重複が生じたら
重複者のみを対象に再度抽選
まだ重複者がいたらさらに再度抽選(・・・)

再抽選回数が0〜300と未定だけども現実的には多くても数回で終わるだろうよ
0755デフォルトの名無しさん (ワッチョイ 4e06-LqCg)
垢版 |
2020/08/02(日) 22:40:10.04ID:i29UoGb/0
>>754
そちらの方がいいですね。
0758デフォルトの名無しさん (ワッチョイ 79ce-Xvfy)
垢版 |
2020/08/03(月) 06:39:58.48ID:R5x2YJ6L0
数学的に「当選者を除外しながら次を抽選」で公平になる

A列に応募者を一列に並べて、2口応募なら2回並べて、存在するデータの行数*RAND()+1で抽選すれば、自動的に口数に比例して当選確率が上がる
当選者はどこかに覚えておいて、A列から除外してから次を抽選

300人の抽選なんて1秒もかからないし、プログラムもきわめて単純、作業列も必要ない
0760デフォルトの名無しさん (テテンテンテン MMee-DfbS)
垢版 |
2020/08/03(月) 11:17:37.07ID:uwp3oPMnM
5ちゃんに書き込んでる時点でお察し
0761デフォルトの名無しさん (ワッチョイ 017c-1vA1)
垢版 |
2020/08/03(月) 11:20:43.87ID:n1hXaiTs0
もう無理して数式でなんとかしようとするよりVBAでさっさと作った方がややこしくないし手っ取り早いんじゃないの
それなら処理時間なんか気にする必要も無し
0764デフォルトの名無しさん (ラクッペペ MMee-LxoB)
垢版 |
2020/08/03(月) 12:34:55.84ID:Dbk7eCCQM
発表は発送をもってかえさせろってのは
みんなインチキだよ

運ちゃんがボスジャン着ていたのは役得
0772デフォルトの名無しさん (ワッチョイ d68e-nhZs)
垢版 |
2020/08/03(月) 18:41:49.78ID:cM5/PGxb0
座って接待を受けるだけの誰にでも出来る仕事
0773デフォルトの名無しさん (ワッチョイ d6b3-UD9X)
垢版 |
2020/08/03(月) 20:25:24.18ID:YOfHflqE0
Sheet2で使うユーザーフォームにSheet1から参照したデータをコンボボックスに表示させ
CMBBox1の入力内容に合わせCMBBox2を連動させたいのですが

CMBbox1はこんな感じでデータを拾っています。
CMBBox1.RowSource = "Sheet1! H3:H" & Worksheets("Sheet1").Range("H" & Rows.Count).End(xlUp).Row

CMBBox2にCMBBox1が入力されると、参照列(H列)の4つ右のセルを表示させるにはどうしたらよいでしょうか
(CNBBox1にSheet1のH3が入力されると、CMBBox2のリストにSheet1のL3が表示される)



似たようなコードを拾ってきたのですがこれを弄って使えるようにしたいです。
Private Sub CMBBox1_Change()
Set ws = Worksheets("Sheet1")
Col = CMBBox1.ListIndex + 12
品名CMB2Box.Clear
For i = 1 To ws.Cells(Rows.Count, Col).End(xlUp).Row
CMBBox2.AddItem ws.Cells(i, Col).Value
Next
End Sub

よろしくお願いします
0774デフォルトの名無しさん (ワッチョイ 01e6-LxoB)
垢版 |
2020/08/03(月) 21:06:03.90ID:ukM+b7An0
リストに1件だけ表示っておかしくね?
そのデザインは却下だ
0776デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/03(月) 21:37:39.33ID:nPxqefQu0
A列最終行の次の行から、下方向150行に本日の日付を表示させたいのですが、
どう記述して良いのかわかりません。
ぐぐって最終行取得のコードまでは見つけたのですが、指定範囲に日付表示のコードを
見つけることが出来ませんでした。
お手数をおかけしますが、ご教授をお願いします。
0777デフォルトの名無しさん (ワッチョイ fa2f-LqCg)
垢版 |
2020/08/03(月) 21:49:07.37ID:QvK0nIgr0
>>773
自分で考える気なさそうだな
その拾ってきたコードのどこが分からんのだよ?

それが出来てそのあとどうする気か知らんが
CMBbox2.Clear
CMBbox2.AddItem (Sheet1.Cells(CMBbox1.ListIndex + 3, "L").Value)
これで、二度と来るな
0778デフォルトの名無しさん (ワッチョイ d68e-nhZs)
垢版 |
2020/08/03(月) 21:53:06.72ID:cM5/PGxb0
また馬鹿が出てきた
0781デフォルトの名無しさん (ドコグロ MM9a-kmLJ)
垢版 |
2020/08/03(月) 23:40:17.65ID:hUMORhdPM
forなんて使わなくてもいいんじゃね

Sub test()
Dim i As Long
i = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(i + 1, 1), Cells(i + 150, 1)) = Date
End Sub
0783デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/04(火) 00:12:45.83ID:brj+kH5Y0
>>780
ありがとうございます!
あとは自力で頑張ってみます!
0784デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/04(火) 00:17:38.16ID:brj+kH5Y0
>>781
解答ありがとうございます!
1つの答えに対し複数のコードがあるって面白いですね!
初歩的なコードが書けるよう頑張ってみます。
0786デフォルトの名無しさん (ワッチョイ d68e-nhZs)
垢版 |
2020/08/04(火) 01:06:00.92ID:8QweQuKX0
>>784
死ねよ
0787デフォルトの名無しさん (ワッチョイ 79ce-Xvfy)
垢版 |
2020/08/04(火) 02:59:27.48ID:o+2T/J1u0
RNDやRAND関数は疑似乱数だから公平じゃない
そもそもコンピューターで乱数を生成するのは不可能

知識としては知ってるけど、代替手段を考えるのも面倒だしみんなRNDを使ってるから別にいいんだよ、ってこと
0789デフォルトの名無しさん (ワッチョイ 794e-wQ/k)
垢版 |
2020/08/04(火) 06:07:40.64ID:vydsY05j0
同じシード与えたら同じ乱数列吐くよね。
で?何のためにあるって?
0794デフォルトの名無しさん (ワッチョイ 5d01-UD9X)
垢版 |
2020/08/04(火) 09:23:33.17ID:Lx6h4ngm0
数式で「真の乱数」を発生させることは不可能でしょ
何かしらの雑音を外部から取り入れるならあり得るけど

しかし真の乱数と区別できない疑似乱数というのはある
たかだか数万個の乱数を発生させる程度なら普通にRANDで構わんよ
コンピューター空間内(例えば64bit)なら32bitの疑似乱数を発生させ得る
0796デフォルトの名無しさん (ワッチョイ 7a4f-1TqB)
垢版 |
2020/08/04(火) 12:47:00.19ID:aUyBUHRY0
>>794
数式で真の乱数を発生させることが出来ないのは多分そう。ただ、それでも真の乱数は発生出来る。

ただ、かなり特殊な環境で言語的にもかなり特殊なのでVBAだけやってる人にはまぁ分からないだろう。

ただそれは、一度世界で最も出回ったハードであり言語でもあって、それでは乱数を求めるのに至極当たり前の方法でもあったから
このスレにいるおじいちゃんにはひょっとして知ってる人もいるかも知れない。
0798デフォルトの名無しさん (JP 0H62-3SEW)
垢版 |
2020/08/04(火) 13:32:34.79ID:Z82jJjcAH
学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
UIライブラリ (C#, 2D) を作ったよ
連続と離散を統一した!
4Dエンジン
matrixのライブラリ
ある強力なFor関数
SQLライブラリ

☆ VM + ASM を書いた (C#, DX) * x86 ではない!
ttp://up.x0000.net/files/TSimulang.zip
☆ malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
0805デフォルトの名無しさん (バットンキン MM2d-6wop)
垢版 |
2020/08/07(金) 19:45:16.94ID:Gk+vywdrM
スレチだったらスマソだけど、excelのスピル?のせいで、ver違うexcel間で共有してたファイルが勝手に配列やら@やら数式が変換されてバグってんだけど、これ無効にできないの?
0806デフォルトの名無しさん (アメ MM75-cUya)
垢版 |
2020/08/07(金) 20:09:47.44ID:l761nrW2M
>>805
キミにピッタリな格言を贈ろう。
It is no use crying over spilt milk
0811デフォルトの名無しさん (ワッチョイ 0101-FoHg)
垢版 |
2020/08/07(金) 22:08:09.38ID:TxGR6Whm0
旧バージョンの配列式に勝手に@が付くのは仕様じゃねえの
旧verの {=a1:a3} が新verでは =@a1:a3 に変換される
新verのスピル式 =a1:a3 は旧verでは {=a1:a3} に

VBA的にはFormulaプロパティとFormula2プロパティを使い分けることによって新旧verどっちにするかを指定できる
0817デフォルトの名無しさん (ワッチョイ 13ad-e++8)
垢版 |
2020/08/09(日) 13:28:26.53ID:w6SyFcxE0
セルA1~A5に1~5が入っていて、5個のaverage=3ですが、
1) 複数の連続セルを選択することで同じ動作をするfunction
2) function 自作平均値(セルを1個指定する as ???, 上のセル数 as byte, 下のセル数 as byte) as double
で、=自作平均値(A3, 2, 2) としたら同じ結果を得る関数
ってそれぞれどう書けばよいでしょうか。
値を直接入力する予定はなく、セルアドレスを取得できれよいかと思いますが、
方法がわかりません。
参考urlでかまいませんので教えてください。
0821デフォルトの名無しさん (ワッチョイ 1b8c-Ea0s)
垢版 |
2020/08/09(日) 23:01:18.40ID:1ZjA1+PB0
>>817
Function 自作平均値(セルを1個指定するAs Range, 上のセル数, 下のセル数)
自作平均値 = Application.WorksheetFunction.Average(セルを1個指定する.Offset(-上のセル数).Resize(上のセル数 + 下のセル数 + 1).Value)
End Function

文章が意味不明なんだけどこんな感じでいいの?
0822デフォルトの名無しさん (ワッチョイ 59ce-IIsV)
垢版 |
2020/08/10(月) 01:01:45.89ID:rZUUjilg0
>>819
Excelの画面をビデオ録画する操作はExcelを起動してから田+Alt+R
ただしVBEのウィンドウは開いても重ねても録画されないので、ワークシート上にマクロの起動ボタンを置いておく必要がある
0828デフォルトの名無しさん (アウアウウー Sa55-h0ig)
垢版 |
2020/08/11(火) 02:22:17.18ID:w/eGi/vSa
VBAの知識は全く無いけど無駄な事は少しでも省きたい
そこで質問なのですが、複数の結合されたセルの値を一括でクリアしたい時
Range(“A1”).MergeArea.ClearContents
Range(“A2”).MergeArea.ClearContents
Range(“A3”).MergeArea.ClearContents
Range(“A4”).MergeArea.ClearContents
ひたすら続く

これを短くするにはどうすれば良いでしょうか?
0831デフォルトの名無しさん (ワッチョイ eb8e-bBGy)
垢版 |
2020/08/11(火) 03:10:45.62ID:iwyIkneF0
>>830
死ね
0842デフォルトの名無しさん (ワッチョイ 1302-2X+j)
垢版 |
2020/08/11(火) 15:03:15.53ID:3p+RdAeo0
Clearはセルに入力されてる数式や値、そして設定されてる書式もすべて消す
.ClearContents は数式と値のみクリア、書式は残る
.Value=Emptyはニュアンスが逆で"何も無いを入力"、つまり消す。.ClearContentsと同じ

deleteキーは.ClearContentsや.Value=Emptyと同じ
0845デフォルトの名無しさん (ワッチョイ 2e7b-PxzN)
垢版 |
2020/08/12(水) 02:04:20.40ID:ArSORnRx0
>>834-844 ありがとうございます!
皆さんが言うように全くの知識ゼロですが色々検索してなんとか思った通りのボタンが完成しました。
しかし全角やらスペースやら分かり辛いプログラムって難しいですね...
0847デフォルトの名無しさん (ワッチョイ 4549-p5K4)
垢版 |
2020/08/12(水) 23:02:53.31ID:Akz/zcS80
n行ごとにデータを拾って少し文字列等を足してからほかのシートに貼り付ける、
という作業を現在For文でやっています。行数が多いと多少時間がかかることも
あるので、配列でできないかと思い試してみたのですが、「n行ごと」の部分が
うまくいきません

Dim tmpArr(), tmp As Variant
Dim rowIndex, colIndex As Long

tmpArr = Worksheets(1).Range("A3:C101").Value
For rowIndex = 1 To UBound(tmpArr) - 2 Step 3
For colIndex = 1 To UBound(tmpArr, 2)
tmp = tmpArr(rowIndex, colIndex) & "結合データ"
tmpArr(rowIndex, colIndex) = tmp
Next
Next

Worksheets(2).Range("A3:C35").Value = tmpArr

上記の場合3行ごとに元の値に「結合データ」という文字列を足すことはできて
いるのですが、貼り付け先のシートに全行貼り付いてしまいます
3行ごとの場合に要らない2行目、3行目を除外して
Sheet1 1行目→Sheet2 1行目、Sheet1 4行目→Sheet2 2行目…
というように貼り付けるにはどこを変更したらいいでしょうか

貼り付けたあと要らない行を削除してみたのですが、却って時間がかかって
しまったため、それ以外の解決方法があれば教えてください、よろしくお願いします
0848デフォルトの名無しさん (ワッチョイ 623d-KAoe)
垢版 |
2020/08/12(水) 23:09:52.81ID:J7mAx2fT0
>>847
tmparrの要素数見てみ
もう1つ別に、貼り付け用のVariant型配列用意して新しく格納していかないとそりゃ空白行できるよ

それと、stepよりmodで条件分岐スキップさせる方がスマートじゃないかい
0849デフォルトの名無しさん (ワッチョイ 45ce-p0wA)
垢版 |
2020/08/12(水) 23:38:22.31ID:neehvUDc0
>>847
こういうこと
あと、Dimの書き方もこうしないとだめ

Sub Macro1()
  Dim tmpArr() As Variant, tmp As Variant
  Dim rowIndex As Long, colIndex As Long
  Dim arrIndex As Long  ' 配列用のインデックス

  tmpArr = Worksheets(1).Range("A3:C101").Value
  arrIndex = 0
  For rowIndex = 1 To UBound(tmpArr) - 2 Step 3  ' セルアドレスは3ずつ増やす
    For colIndex = 1 To UBound(tmpArr, 2)
      tmp = tmpArr(rowIndex, colIndex) & "結合データ"
      tmpArr(arrIndex, colIndex) = tmp
    Next
    arrIndex = arrIndex + 1  ' 配列のインデックスは1ずつ増やす
  Next

  Worksheets(2).Range("A3:C35").Value = tmpArr
End Sub
0851デフォルトの名無しさん (ワッチョイ 45ce-p0wA)
垢版 |
2020/08/13(木) 00:25:56.44ID:87HjPNaJ0
>>850
そういう時はセル範囲を変数にして、どっちかのインデックスを3で割るか掛けるかすればいいんだよ
それならメンテは一箇所で済む
データの範囲をxlUpとかUsedRangeなどで調べたりテーブル化すれば全自動にもできる
0852デフォルトの名無しさん (ワッチョイ 4549-p5K4)
垢版 |
2020/08/13(木) 01:36:11.66ID:cxZ8EfEa0
>>849
ありがとうございます
最初インデックスが有効範囲にないとエラーがでたので「arrIndex = 0」を
「arrIndex = 1」に変えたらできました
配列なので0から始まるということなのかと思ったんですが、1にしても
大丈夫なんでしょうか?出力した結果はForのものと同じだったので
貼り付け後に1行ずれるということはなさそうなんですが…

しかし確かに速いですね、配列
データを5000行×3列にしてテストしたら
For 約2.7秒
配列 約0.03秒
といった感じでした

>>850,851
コピー元のセル範囲は変数にして見出し行引いてnで割ったりして貼り付け先の
範囲を出してます
今回は決まった数字の方がいいかなと思って99行を3行ごとで33行、みたいに
してみました
0854デフォルトの名無しさん (ワッチョイ 451c-p0wA)
垢版 |
2020/08/13(木) 11:07:02.86ID:rrpNLQgi0
環境
windows 10 64bit
office 365 64bit
string型変数strにスペースを埋める単純なコードです。

Sub test()
Dim num_i As Integer
Dim num_l As Long
Dim num_ll As LongPtr
Dim str As String

Debug.Print "integer"; Len(num_i); TypeName(num_i)
Debug.Print "long"; Len(num_l); TypeName(num_l)
Debug.Print "longptr"; Len(num_ll); TypeName(num_ll)

num_i = 16: num_l = 16: num_ll = 16

str = Space(num_i): Debug.Print ">>"; str; "<<"
str = Space(num_l): Debug.Print ">>"; str; "<<"

''動かない
'str = Space(num_ll): Debug.Print ">>"; str; "<<"
''動く
str = Space(CLng(num_ll)): Debug.Print ">>"; str; "<<"
End Sub

このように64bitに対応していない組み込み関数って結構あるんのだろうか・・・
いつからか忘れたけど、 64bit推奨しているなら、これぐらい対応しろよ、毎糞がぁぁあ
excelの64bit環境って現状こんなものなの?
0855デフォルトの名無しさん (ワッチョイ 4549-p5K4)
垢版 |
2020/08/13(木) 11:30:36.17ID:cxZ8EfEa0
>>853
インデックスを確認したところ
rowIndex 1→1→1→4→4→4→7→7→7
colIndex 1→2→3→1→2→3→1→2→3
arrIndex 1→1→1→2→2→2→3→3→3
というように変化していきましたので大丈夫そうです、ありがとうございました
0859デフォルトの名無しさん (ワッチョイ 4549-p5K4)
垢版 |
2020/08/13(木) 14:08:49.69ID:cxZ8EfEa0
>>858
あ、そっちでしたか
エラーが出た状態のそれぞれのインデックスは
rowIndex 1
colIndex 1
arrIndex 0
でしたので、
tmpArr(arrIndex, colIndex) = tmp
のところが
tmpArr(0, 1) = tmp
になってエラー、ですかね?
0860デフォルトの名無しさん (ワッチョイ ad7c-s47K)
垢版 |
2020/08/13(木) 14:16:56.76ID:KWfn8cHZ0
>>859
tmpArrにインデックス0は存在しないのに指定するからエラーが出ていて、セル範囲を代入した時は1から始まることを知らなくても変数の状態をチェックすればすぐわかることだが、もしかしてローカルウィンドウとかを知らないパターン
0861デフォルトの名無しさん (ワッチョイ 4549-p5K4)
垢版 |
2020/08/13(木) 14:35:55.00ID:cxZ8EfEa0
>>860
あんまり使いこなせてはいないですがローカルウィンドウは表示させています
849さんが教えてくれたコードの中でarrIndexを「0」に指定しているのにはなにか
理由があるんじゃないかと思ったんですが、書き間違いとかでしょうか?
0864デフォルトの名無しさん (ワッチョイ 2e10-s47K)
垢版 |
2020/08/14(金) 07:43:46.87ID:whfJUs+50
VLOOKUPについての質問なんですが、

検索キー 検索範囲1 検索範囲2    産地
りんご    りんご     ぶどう      岡山産
        みかん    りんご      岡山産
        いちご     もも       岡山産
        りんご     ぶどう      山梨産
        みかん     なし       山梨産
        いちご     りんご      山梨産


りんごから別セルの検索範囲1を見た後に検索範囲2を見にいって産地の戻り値を得る関数を作りたいのですが、
検索キーのヒットで産地が重複した場合は表示を1度だけにして、期待する結果として「岡山県 山梨県」とだけ得られるような関数を作りたいです
VLOOKUPを&で繋げると「岡山県岡山県」と列の一番初めの戻り値しか得られません
VLOOKUP以外でもやり方があれば教えて頂ければ助かります
0865デフォルトの名無しさん (ワッチョイ 4290-p5K4)
垢版 |
2020/08/14(金) 11:35:06.45ID:DbBU1lOD0
>>864 マクロ作りました。
最大100件までヒット可能です。
長くなって申し訳ありません。
ご参考までに。(1/3)

Option Explicit
'/// 変数定義
Public j As Long 'ヒット件数
Public strArray(99) As String 'ヒットした産地の配列

Sub Main()

Call 初期化
Call 検索処理("B", 2)
Call 検索処理("C", 1)
Call メッセージ

End Sub
0866デフォルトの名無しさん (ワッチョイ 4290-p5K4)
垢版 |
2020/08/14(金) 11:35:39.43ID:DbBU1lOD0
Sub 初期化() '///グローバル変数の初期化  (2/3)
'/// 変数定義

Dim i As Long 'カウンタ
j = 0
For i = 0 To 99
strArray(i) = ""
Next i
End Sub

Sub 検索処理(pCol As String, pMovNum As Long)
'/// 変数定義
Dim i As Long 'カウンタ
Dim lngMaxRow As Long '処理数
Dim strKey As String '検索値
Dim strSanchi As String 'ワーク変数

'/// キー
strKey = ActiveSheet.Range("A2").Value
'/// 処理数
lngMaxRow = ActiveSheet.Range("B1000").End(xlUp).Row
'/// ループ
For i = 2 To lngMaxRow
If strKey = ActiveSheet.Range(pCol & i).Value Then
strSanchi = ActiveSheet.Range(pCol & i).Offset(0, pMovNum).Value
If 重複チェック(strSanchi, strArray()) = False Then
strArray(j) = strSanchi
j = j + 1
End If
End If
Next i
End Sub
0867デフォルトの名無しさん (ワッチョイ 4290-p5K4)
垢版 |
2020/08/14(金) 11:36:01.63ID:DbBU1lOD0
Function 重複チェック(pSanchi As String, pArray() As String) As Boolean(3/3)
'/// 変数定義
Dim i As Long 'カウンタ

'/// ループ
For i = 0 To 99
If pSanchi = pArray(i) Then
重複チェック = True
Exit Function
End If
Next i
重複チェック = False
End Function

Sub メッセージ()
'/// 変数定義
Dim i As Long 'カウンタ
Dim strAnswer As String 'ワーク変数

strAnswer = strArray(0)
'/// メッセージ出力
For i = 1 To j
If strArray(i) <> "" Then
strAnswer = strAnswer & "," & strArray(i)
End If
Next i
'/// 1件でもあれば表示
If j > 0 Then
MsgBox (strAnswer)
End If
End Sub
0868デフォルトの名無しさん (ワッチョイ ad7c-s47K)
垢版 |
2020/08/14(金) 12:26:16.36ID:RMq/G2m80
Dim obj As Object
Dim rng As Range

Set obj = CreateObject("Scripting.Dictionary")
For Each rng In Range(検索範囲)
 If rng.Value = Range("a2").Value Then
  With Cells(rng.Row, "d")
   If obj.exists(.Value) = False Then obj.Add .Value, 0
  End With
 End If
Next
Range("e1").Resize(obj.Count).Value = WorksheetFunction.Transpose(obj.keys)
Set obj = Nothing
0875デフォルトの名無しさん (スプッッ Sd1f-POXI)
垢版 |
2020/08/24(月) 18:59:52.50ID:ga12x2Hwd
A列には数字を手入力
B列には●があったりなかったり

B列に●がある場合A列に数字を(例えば100)入力するとメッセージボックス?がでて
「●があるから入力しちゃ駄目よ!どうしても"100"を入力したいの!?」
「OK」「キャンセル」
みたいにしたいんですがどーすればいいですか?
0879デフォルトの名無しさん (スップ Sd1f-5gYb)
垢版 |
2020/08/24(月) 20:27:42.41ID:N/ceNi6Ud
>>875だけどいい忘れてました
0を入力した場合はメッセージ出さずにそのまま0と入力
0以上(例えば200)を入力した場合は「●なんだから入力すんなボケ!どうしても"200"って入力したいの?」
「OK」「キャンセル」
みたいなね
0881デフォルトの名無しさん (ワッチョイ 9f8e-NwtD)
垢版 |
2020/08/24(月) 20:35:32.06ID:C0VIZWNb0
馬鹿は条件を後で付け加える
0883デフォルトの名無しさん (ラクッペペ MM4f-NoNb)
垢版 |
2020/08/24(月) 20:42:38.20ID:hwq7Y5YHM
メッセージボックスはうっとおしいからセルの色を変えるぐらいのほうが喜ばれるよ
0891デフォルトの名無しさん (ドコグロ MM7f-a78p)
垢版 |
2020/08/24(月) 22:34:30.60ID:6Nxhc9klM
個性的な物を作りたいのなら図形を使えば色も形も自由自在に作れる
0892デフォルトの名無しさん (ワッチョイ ff63-3Lde)
垢版 |
2020/08/25(火) 07:27:56.68ID:Dix5Myuw0
Win10で、VBAを作っています。
テキストファイルをLine関数で1行ずつ読み込み
読んだ行にてInStr関数で円マーク(\)を検索
しています。
InStr(1, 検索対象, "\")
と書いています。
しかし\が無い行で「ある」と判定されているようです。
\にはエスケープ文字が必要だからではないかと思いますが
どう書いたら良いかわからず途方に暮れています。
どなたかご教示ください。
(文字コードで指定すれば良いようですが
他の担当者が理解できない可能性もあるので
別の方法も把握したく存じます)
0899デフォルトの名無しさん (ラクッペペ MM4f-pqEW)
垢版 |
2020/08/25(火) 12:47:56.13ID:LoAGT2GVM
>>893
会社の住所です
一文字目が全角郵便マーク
2文字目が全角スペース
三文字目から半角数字で郵便番号です。
\と半角ハイフンの間を取り出す処理を
書いたところ
郵便番号最初の3桁、
ハイフンの手前まで
が取り出されますので
全角スペースが\マークとして
扱われてると思ってます
0900デフォルトの名無しさん (テテンテンテン MM4f-Is5t)
垢版 |
2020/08/25(火) 12:58:49.60ID:KRGfI1UYM
>>893
「\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
\と半角ハイフンの間を取り出す処理
を全角スペースが\マークとして扱われてると思ってます
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-」
0902デフォルトの名無しさん (ワッチョイ ff02-YpYZ)
垢版 |
2020/08/25(火) 13:39:05.50ID:UEyqjSRY0
>>899
その説明だとコード晒してもらわないとわからん
住所そのまま晒してって言ってるんじゃなくて
別の文字に置き換えていいから同じフォーマットで
処理前後でどうなってほしい所がどうなってしまうのか書いてもらわないとわからない
0909デフォルトの名無しさん (ラクッペペ MM4f-pqEW)
垢版 |
2020/08/25(火) 15:50:41.61ID:LoAGT2GVM
すみません892です
デバッガで見たら
全部の行で1を返してました
つまり全行、先頭は\マークみたいです
1文字目は無視するようにしたら
意図通りの動きになりました
0912デフォルトの名無しさん (オッペケ Sr73-rg60)
垢版 |
2020/08/25(火) 17:36:53.32ID:Lm28KJF/r
VBAからPowerShellで外部コマンドを実行して出力内容を加工したいのですが、うまくいきません
現在は、Execの引数に下記のように書いてます
powershell -Command "& Invoke-Expression 'コマンドのパス\コマンド.exe' -option1 -option2 "foo bar" >>'一時ファイル.txt'"

どうしたらよいでしょうか
0916デフォルトの名無しさん (ラクッペペ MM4f-NoNb)
垢版 |
2020/08/25(火) 20:53:13.85ID:4vNIHvGrM
shell でいいのにわざわざ外部オブジェクト使う人っているよね
0917デフォルトの名無しさん (アウアウウー Sa63-/2iM)
垢版 |
2020/08/25(火) 21:28:28.78ID:n9RIifSya
>>914
改行コードは別に文字列としての\が入ってる訳じゃないだろ
0918デフォルトの名無しさん (オッペケ Sr73-rg60)
垢版 |
2020/08/25(火) 22:12:02.97ID:Lm28KJF/r
>>915
ありがとうございます
もう一点よろしいでしょうか
標準出力にUnicodeで吐き出すコンソールアプリの出力を、Wscript.Shell.ExecのStdOutを使用して読み込みたいのですが、文字化けします
個人情報を扱うのでできれば一時ファイルを作らずに作業したいのですが、Unicodeの標準出力を直接読み込む方法は無いでしょうか
0920デフォルトの名無しさん (ワッチョイ 118e-WkEz)
垢版 |
2020/08/26(水) 01:37:45.74ID:zCSTsYdn0
>>918
スレチだろ、厚かましい
0922デフォルトの名無しさん (ワッチョイ 7901-yRqa)
垢版 |
2020/08/26(水) 02:56:47.46ID:oEB3gdtA0
これから新規に作る形式の文字コードは、UTF-8とGB18030の二択じゃないでしょうかね。
0923デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 11:13:08.29ID:DBm/bRJ+r
>>921
調べたところわかりませんでした
Unicodeの文字が欠落するのでSJISに変換して流すのも避けたいです
一晩考えてPowerShell側でBase64エンコードしてからVBA側でデコードしてみようと考え直しました
失礼しました
0924デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 11:25:02.41ID:DBm/bRJ+r
ちなみに、Wscript.Shell.Execに渡せるコマンドラインって255文字までのような制限があるのでしょうか
コンソール側で動いたコマンドラインがExecからだと動かなかったりするので
0927デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 19:09:15.11ID:DBm/bRJ+r
>>926
ありがとうございます。
PowerShell上で動作を確認したワンライナースクリプトをExecで実行したら動かなかったもので、特に根拠があって疑ってる訳じゃないです。
こちらはPS1ファイルを用意して実行することにしました。
0928デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 19:15:01.39ID:DBm/bRJ+r
ところで、ADODB.Streamに書き込んだテキストをCSVとしてパースしてRecordSetに読み込む方法をどなたかご存知ないでしょうか
一時ファイルを保存すればいいのですがオンメモリでやれたらそちらの方がありがたいです
同じADODBクラスなので方法がありそうだなと思い調べてみたのですが…
0929デフォルトの名無しさん (ワッチョイ 118e-WkEz)
垢版 |
2020/08/26(水) 20:35:45.89ID:zCSTsYdn0
>>928
厚かましいスレチはいい加減にしろ
0933デフォルトの名無しさん (ワッチョイ 02b5-lmXr)
垢版 |
2020/08/26(水) 22:52:29.85ID:FaIObZsK0
一年他部署に応援行ってて戻ってきたが
その間に転属されてた人に

これがあれば一覧のデータを一気に出力できるからマクロの使い方だけは覚えてね
マクロとかわかる?とにかく使い方おぼえて
と言われた
俺が応援行く前に作って課に展開したマクロやんけ…
0934デフォルトの名無しさん (ベーイモ MM16-4W6K)
垢版 |
2020/08/27(木) 10:45:53.98ID:M3gK7ks0M
strconvで文字列"試験"をUnicodeに変換すると、変な文字に変換されるんだけど解決策ありますか?

StrConv(StrConv("試験",vbUnicode),vbFromUnicode)
の結果が、"試験"であってほしいんだけど、別のよくわからない文字に変換される
0935デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/27(木) 10:56:45.12ID:EdbkG5X3r
>>931
情報小出しですみません。

UTF8で標準出力に個人情報含むCSVを吐き出すコンソールアプリがありまして、それを一時ファイルを使用せずにVBAに読み込むのが目的です。

Wscript.Exec.StdOutを使用したところUTF8が文字化けしてしまい、PowerShell上でByte配列化→Base64エンコードして吐き出すことで、VBAでCSVのStringを得るところまではできました。
0937デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/27(木) 11:04:53.94ID:EdbkG5X3r
VBAでBase64デコードしたByte配列をADODB.Streamにバイナリ書き込み・UTF8読み込みすることでString変数に収めるところまでは行けました。
ここから、ADODB.Connectionを使用してADODB.Streamの内容をCSVとしてパースしたいのですが、ネットで見られるサンプルコードはファイルを読み込むものばかりです。
試しにADODB.Connection.Open ADODB.Streamとしてみましたが、うまく行きません。
現在ADODBのリファレンスに目を通していて、関係の有りそうなプロパティを見て回っているのですが、方法をご存知の方いらっしゃればご教示いただけるとありがたいです。
0939デフォルトの名無しさん (ワッチョイ 452c-VQ5f)
垢版 |
2020/08/27(木) 11:35:18.54ID:UMnMnU6h0
WSH は、CP932 だけじゃないの?
もうWSHは、Microsoft もサポートしていないのでは?

WSH, VBScript のスレのスレ主、ピッコロ大魔王に聞けば?

漏れは、Ruby スクリプトをダブルクリックで起動したい場合に、WSHを使っているけど、
その際、Ruby側で、CP932・UTF-8 を変換している。
または、NKF というモジュールもある
0940デフォルトの名無しさん (ドコグロ MM22-YRmH)
垢版 |
2020/08/27(木) 11:58:06.46ID:tH7sxKPhM
>>934
そりゃそうだろ…
Unicode文字列をShift-JISだと思ってUnicodeに変換して、それを更にUnicodeだと思ってShift-JISに変換して何をしたいんだ?
やりたいのは
StrConv(StrConv("試験", vbFromUnicode), vbUnicode)
かな?
0941デフォルトの名無しさん (ベーイモ MM16-4W6K)
垢版 |
2020/08/27(木) 12:21:37.52ID:M3gK7ks0M
AddDllDirectory関数の引数にパスを渡したい
この関数の引数はUnicode文字列をである必要があるから、StrConvでUnicode変換してから渡す
変換がうまく行く文字だけのパスなら、AddDllDirectory関数は成功するが、変換がうまくいかない文字が含まれるパスだと失敗する
0949デフォルトの名無しさん (ベーイモ MM16-4W6K)
垢版 |
2020/08/27(木) 17:02:04.95ID:DiWyHVVAM
AddDllDirectory(StrConv(パス,vbUnicode))ってコールしたときに
パスに特定文字が含まれると失敗、含まれないと成功

文字の例は>>946のとおり
明らかにStrConvの文字コード変換がおかしいと思うんだけど

ちなみに第2引数をvbFromUnicodeにすると、どんな文字列でもAddDllDirectoryは失敗する
StrConvを噛ませずに、パスを渡した場合も必ず失敗する
0951デフォルトの名無しさん (ワッチョイ 61da-1etN)
垢版 |
2020/08/27(木) 19:32:16.28ID:nk+dwtaU0
>>935
やっぱわからん。
「UTF8で標準出力に個人情報含むCSV」って、既にその時点でCSVなんじゃないの?
CSVなのにカンマ区切りじゃなくてCSVとして扱えないとか?(何じゃそりゃ)
UTF8が問題ならschema.ini作って回避できない?
schema.ini使う時点で一時ファイルだわって言われたらそれまでだけど。
0953デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/28(金) 03:17:22.48ID:0Wmy1rK2r
>>951
CSVファイルではなく、CSVの文字列になります
これをファイルに保存することなくパースしたかったのですが、方法が見つかりませんでした。
セル内カンマやセル内改行も含むCSVでしたので、自分でパースするのもちょっと大変でした。
MITライセンスのコードを見つけたのでそれを組み込んで処理しようと思います。
ありがとうございました。
0955デフォルトの名無しさん (ワッチョイ 452c-VQ5f)
垢版 |
2020/08/28(金) 10:58:16.31ID:CzRmvnjE0
Ruby なら標準で、CSV モジュールが付いている。
他にも、JSON, YAML などもパースできる

プログラミングするなら、ちゃんとしたプログラミング言語を使わないと、ダメ!
汎用的な機能を、自作して使うと、バグってばかりで仕事にならない
0958デフォルトの名無しさん (ワッチョイ 6e63-VQ5f)
垢版 |
2020/08/28(金) 23:36:31.47ID:KRJ+x4lY0
エクセル2010を使ってます。
ファイル名の先頭に前月の年と月を付けたいと思い
下のような式を書きました。
本日動かすと「202007」と付きます。
しかし先頭の20を削除し2007としたいです。
式をどのようになおしたら良いか自力ではわかりません。
お恥ずかしいですがご教示いただきたく。
newfilename = Format(Year(DateSerial(Year(Date), Month(Date) - 1, Day(Date))), "00") _
& Format(Month(DateSerial(Year(Date), Month(Date) - 1, Day(Date))), "00") _
& currentfilename
0962デフォルトの名無しさん (ワッチョイ 6e63-VQ5f)
垢版 |
2020/08/29(土) 00:20:59.98ID:M2c3GV/+0
>>959
ヘルプといいますが色々なサイトを見ましたが私の頭では理解できず・・
やむを得ずお伺いしました
>>960
この式で出来ました!本当にありがとうございます!
0964デフォルトの名無しさん (ワッチョイ 118e-WkEz)
垢版 |
2020/08/29(土) 01:26:16.94ID:uG4P+RAn0
>>963
自分の意思で呼吸を30分止めてご覧
それができなければVBAを使う資格なし
0966デフォルトの名無しさん (ラクッペペ MM66-i8JQ)
垢版 |
2020/08/29(土) 04:49:38.60ID:OUCG9mQHM
>>965
はぃ、それで良いです
言葉足らずですみません
0967デフォルトの名無しさん (ブーイモ MMf6-xiBb)
垢版 |
2020/08/29(土) 05:11:12.22ID:nRBZReLEM
>>966
Sub Macro1()
  Dim s1 As String
  Dim s2 As String
  Dim s3 As String
  Dim c As String
  Dim i As Integer
  s1 = "001100-004400-007700" '入力
  s2 = ""
  s3 = ""
  For i = 1 To Len(s1)
    c = Mid(s1, i, 1)
    If "0" <= c And c <= "9" Then
      s2 = s2 & c
    Else
      If s2 <> "" Then
        s3 = s3 & s2 * 1 & c
        s2 = ""
      Else
        s3 = s3 & c
      End If
    End If
  Next
  If s2 <> "" Then
    s3 = s3 & s2 * 1
  End If
  Debug.Print s3 '出力
End Sub
0970デフォルトの名無しさん (ワッチョイ 6101-u5JS)
垢版 |
2020/08/29(土) 06:40:50.33ID:VAMGDei30
そんな難しいことしなくてもこれでよくないか

Sub test()

Dim testStr As String
Dim rtnStr As String
Dim cnvNm As Long

testStr = "000070-00100-01230"

For i = 1 To Len(testStr) + 1

s = Mid(testStr, i, 1)

'数値か判定
If (IsNumeric(s)) Then
strNum = strNum + s
Else
'数値に変換
cnvNm = Val(strNum)
rtnStr = rtnStr + Trim(str(cnvNm)) + s
strNum = ""
End If
Next
End Sub
0972デフォルトの名無しさん (ラクッペペ MM66-i8JQ)
垢版 |
2020/08/29(土) 07:17:10.36ID:OUCG9mQHM
区切りはハイフンだけです
すみません
分けて各々数字扱いすれば良かったですね
書いてみます
0973デフォルトの名無しさん (ワッチョイ 6101-u5JS)
垢版 |
2020/08/29(土) 08:56:00.81ID:VAMGDei30
デリミタが"-"だけならもっと簡単になるね

Sub test2()

Dim strArray() As String
Dim rtnStr As String

testStr = "000070-00100-01230"

strArray = Split(testStr, "-", , vbTextCompare)

For i = 0 To UBound(strArray)

rtnStr = rtnStr + Trim(str(Val(strArray(i))))

If(i <> UBound(strArray)) Then rtnStr = rtnStr + "-"
Next

End Sub

文字列で連結して返す必要なければsplitして数値変換でおわり
0976デフォルトの名無しさん (ワッチョイ 45cc-pyQU)
垢版 |
2020/08/29(土) 10:00:53.07ID:pUlaC/XX0
For r = 1 To 12000
処理
PDF出力

という処理をしているのですが、これだとPDFが12000ファイルになって、全て出力した後で結合するのですが
これを12000枚程度をPDF1ファイルで出力する方法をおしえてください
0977デフォルトの名無しさん (ブーイモ MMf6-xiBb)
垢版 |
2020/08/29(土) 10:07:03.64ID:m9X9gCs/M
Sub test2()
  Dim strArray() As String
  Dim testStr As String
  Dim rtnStr As String
  testStr = "000070-00100-01230"
  strArray = Split(testStr, "-")
  For i = 0 To UBound(strArray)
    strArray(i) = strArray(i) * 1
  Next
  rtnStr = Join(strArray, "-")
  Debug.Print rtnStr
End Sub
0980デフォルトの名無しさん (ワッチョイ 0201-YRmH)
垢版 |
2020/08/29(土) 10:47:46.31ID:lHm5nrxO0
>>973
Split使うならJoinも使おうよ…
Sub test2()

Dim strArray() As String
Dim rtnStr As String

testStr = "000070-00100-01230"

strArray = Split(testStr, "-", , vbTextCompare)

For i = 0 To UBound(strArray)
strArray(i) = Cstr(Val(strArray(i)))
Next

rtnStr = Join(strArray, "-")

End Sub
0983デフォルトの名無しさん (ワッチョイ 21d2-vZRt)
垢版 |
2020/08/29(土) 11:18:02.61ID:ebvcDddx0
ある言語だと
"00-001-02"split("-")map(asNumber)join("-")println
0985976 (ワッチョイ 45cc-pyQU)
垢版 |
2020/08/29(土) 13:57:00.39ID:pUlaC/XX0
>>978
1シートにはまとめられません。

>>979
日々の取引をデータベースに入力していて、そのデータベースから出力されたデータを取引伝票としてPDF化したいのですが
データベースソフトに取引伝票の書式が設定されていないので、エクセルで作ろうと思います。
1ページごと出力してフリーソフトで結合すると、12時間くらいかかっていたので、エクセルのPDF結合だとAcrobatPro
が必要になるそうなので、この方法もできません。

>>984
シート上に帳票を作り、その帳票をページごとに書き換えています。試していませんが、1シートだと行数が足りないです。
それと、ページごとに罫線とかの書式を作るのはつらいです。
0989デフォルトの名無しさん (ワッチョイ 822f-8BP0)
垢版 |
2020/08/29(土) 14:42:09.88ID:1Tm3n33G0
伝票とかだと保存義務とかあったりして、出力しておいておかないとダメな時もある

1シートで収まらないならある程度で分割してやるしかないし
罫線とか決まったフォーマットならコピーするだけ

が、EXCELでやるのが間違ってるな
ちゃんとした帳票ツール買って対応する言語使えよ
0994デフォルトの名無しさん (テテンテンテン MM66-nUCc)
垢版 |
2020/08/30(日) 00:09:48.26ID:HNjVBgM5M
>>985
Accessでやって下さい
0995デフォルトの名無しさん (ワッチョイ 6e63-8BP0)
垢版 |
2020/08/30(日) 07:04:48.97ID:ZpZWI99c0
IE制御で作る
てどういう意味です?
0996デフォルトの名無しさん (アウアウエー Sa0a-ifKp)
垢版 |
2020/08/30(日) 08:58:33.06ID:IZ41nY3ca
テキストファイルを読み込もうとしているのですが、ファイルがないとエラーが出ます。なにが原因でしょうか?
Sub func()
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(i, "A").Value = textLine
i = i + 1
Wend
End Sub
1000デフォルトの名無しさん (アウアウエー Sa0a-ifKp)
垢版 |
2020/08/30(日) 09:13:38.94ID:IZ41nY3ca
フォルダパスに"\"が入っていませんでした。
ありがとうございます!
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 65日 7時間 12分 10秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況