X



Excel VBA 質問スレ Part67

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (ワッチョイ 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
2020/06/26(金) 07:58:40.55ID:PIx3bjtD0
>>1
おちゅ
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
2020/06/26(金) 20:08:11.16ID:SBXE4EMs0
・OpB1って何ですか?丁寧に書いて
・せめてoutputCellInfoのソースは全部書いて
・=thenがガチなのかタイポなのか分からんから直打ちじゃなくてコピペして
2020/06/26(金) 20:20:30.07ID:PIx3bjtD0
日本語訳:

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

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

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

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





面倒だから後はお前らにまかせた
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
2020/06/26(金) 20:40:26.18ID:nEhmFRZ4a
なんでElseに:ついてんだ?
2020/06/26(金) 20:40:29.37ID:1oZqQJala
張り付けたオプションボタンと定義したのは別物じゃね
2020/06/26(金) 20:50:43.26ID:PIx3bjtD0
つか、そもそもそのサイトのコードって正確に動く?
キーワードを含むセルを網羅しないんだけど

nothingになるRangeを比較対象に置いてるあたりがあれだ
2020/06/26(金) 21:05:20.01ID:ZjxMZdyJ0
Elseの:はミスです…
オプションボタンの定義…ググりなおします
>>9そうです、全文では無いんですよね…全文検索くんもDLして
編集しようとしましたが今の私では無理でした。
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)はカッコ悪いから止めた方がいい
解説サイトではやってるけどね
2020/06/26(金) 23:25:32.05ID:ZjxMZdyJ0
>>3です
無理やりですが自己解決しました
標準モジュール2にアウトプットのコードをさわったものをコピペして
コマンドボタンクリックしたときの動作をIfでCallするようにしたら出来ました

でもやっぱりこのコード重いですね。どうにか軽くする方法無いものですかね。
2020/06/26(金) 23:28:15.39ID:ZjxMZdyJ0
>>11修正ありがとうございます、提案されたやり方も試してみます!
2020/06/26(金) 23:49:56.02ID:kQH1YyZn0
配列にすれば
あとやってるかとは思うけど自動計算と画面更新オフ
2020/06/26(金) 23:53:39.92ID:ZjxMZdyJ0
すみません、配列にするとはどういうことをすることですか?
2020/06/27(土) 00:17:07.69ID:KqbSykww0
Cells(1, 1).Value = "あ"
Cells(1, 2).Value = "い"
Cells(1, 3).Value = "う"
  ↓ ↓ ↓
Range("A1:C1").Value = Array("あ", "い", "う")

1個ずつじゃなくて、一気に放り込めってことでしょう。>>15
2020/06/27(土) 02:29:31.12ID:gCUCp3Nd0
そこを高速化してもしかたないのでは・・・
2020/06/27(土) 05:22:36.02ID:J5vHObt/0
他人にコード書かせて動かしたら遅いと文句言うのって人としてどうなの?
19デフォルトの名無しさん (ワッチョイ 8fba-8HP2)
垢版 |
2020/06/27(土) 08:53:12.31ID:9qJBLgyD0
>>
20デフォルトの名無しさん (ワッチョイ 8ff1-of6p)
垢版 |
2020/06/27(土) 09:24:13.86ID:YKskLwzM0
<<
2020/06/27(土) 09:43:15.25ID:wwwZDyDia
ビットシフトとは各桁を 1 桁左や右にずらすことです。

https://www.tipsfound.com/vba/02018

VBA にはそのような演算子はありませんが次のようにしてできます。
\ (2 ^ 1) ' 1 桁右へシフト
* (2 ^ 1) ' 1 桁左へシフト
2020/06/27(土) 10:06:21.20ID:lV2RRwzl0
実行時エラー '6':

オーバーフローしました。
23デフォルトの名無しさん (ワッチョイ 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
24デフォルトの名無しさん (ワッチョイ cf46-pKDl)
垢版 |
2020/06/27(土) 10:55:33.95ID:gKvpRzl30
今日は、タイマー作ってます。
MsgBox 36000*24
はエラーにならないが
MsgBox 24*3600
は実行時エラーオーバーフローしました。
となります。

どうしてなんでしょうか?。
2020/06/27(土) 11:02:47.04ID:aTkq7ke+a
>>23
教えてキャン>>98<<ビー
https://oshiete.goo.ne.jp/qa/597623.html
>Win98系のOSの場合ですが、処理中に、
頻繁にDoEventsを実行する必要があります。
 これは、OSの特性です。
2020/06/27(土) 11:13:07.90ID:lV2RRwzl0
釣りなのか本気なのか判断に困る質問だな
2020/06/27(土) 11:48:36.47ID:P+1UXm0n0
ヤベーイ
2020/06/27(土) 23:20:44.51ID:J5vHObt/0
動作がおかしいのは古いからじゃないかな
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)のバージョンは関係ない
最新でも仕様は変わってないから同じ所でエラーになる
2020/06/28(日) 07:42:30.13ID:sqW+tWgm0
>>29
へー面白いね
2020/06/28(日) 07:45:50.98ID:/E8O58u/0
プロジェクトウィンドウが何かの表紙に名前順にソートされてしまったんですが、標準モジュール、クラスモジュール等の階層表示ってどうやって戻すのでしょうか
2020/06/28(日) 08:01:52.55ID:8pre44tM0
フォルダーの切り替え(黄色いフォルダの絵のアイコン) をクリック
2020/06/28(日) 11:43:32.56ID:VHBre49Bd
>>30
結構、常識だよ。
こういうエラーの時に真っ先に考える。
覚えておくと良い。
詳しく覚えなくても、勝手に型判定のせいかなと考えるだけで全然違う。
2020/06/28(日) 12:14:58.87ID:dFUOn9oJ0
適当なこと言っててワロタ
35デフォルトの名無しさん (ワッチョイ 7f8e-hynA)
垢版 |
2020/06/28(日) 13:50:31.47ID:Gnbk8j2I0
>>34
何が適当なんだ?
言語仕様の基本だろう
>>33に俺を言うべき
36デフォルトの名無しさん (ワッチョイ 7f8e-hynA)
垢版 |
2020/06/28(日) 13:50:52.16ID:Gnbk8j2I0
俺ではなくお礼
2020/06/28(日) 14:21:14.54ID:t+bqi6uL0
38デフォルトの名無しさん (ワッチョイ 8ff1-of6p)
垢版 |
2020/06/28(日) 14:41:16.58ID:O22xrl4H0
>>33
2020/06/28(日) 15:17:28.32ID:IDO0V0ZPa
dim 俺 as string
2020/06/28(日) 16:12:05.93ID:WMjrpZfvF
俺 = "童貞"
2020/06/28(日) 16:56:51.40ID:69pcuKP2M
Const 俺 As String = "童貞"
2020/06/28(日) 17:02:14.70ID:YhC9oGcZa
Do While 俺
俺 = 1
If 俺 > 1 Then
Exit Do
End If
Loop
MsgBox "happy"
2020/06/28(日) 17:20:31.84ID:dFUOn9oJ0
>>35
式の中で最初に出てきた数字によって型が勝手に決められる → 嘘
32767以下の整数はInteger型 → 嘘
24& * 3600 (Double型) → 嘘
24# * 3600 (Long型) → 嘘

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

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

MsgBoxの方は型とか考えたくないので
兎に角勉強になりました。 ありがとうございました。
2020/06/28(日) 19:11:04.99ID:LbQBFJ/O0
>>24
MsgBox 24 * 3600   
MsgBox 24 * 36000

1行目はオーバーフローがでる
2行目はエラーが出ないで普通に計算されます
46デフォルトの名無しさん (ワッチョイ 0f43-3pn7)
垢版 |
2020/06/28(日) 19:21:56.72ID:nTfCGwDP0
特定のフォルダ内のファイルのファイル名を変えて、ついでにプロパティのコメントにも文字を入力したいです
for each f in fol.files
  f.name=ファイル名
  f.comment=コメント
next
みたいな感じでやりたいんですが、f.commentではだめなようです
どう書けばいいか教えてください
2020/06/28(日) 19:23:35.13ID:LbQBFJ/O0
Integer型 * Integer型 の計算結果が 32767を超えるとオーバーフローエラーがでる
Integer型 * Long型 の計算結果が 32767を超えてもエラーにならない

ってことじゃね
2020/06/28(日) 19:28:31.58ID:Vk36drdU0
win10でRS-232C使うとかなりの確率で
Set MSComm1 = New MSComm 
のところでエラーになります

どうにかなりませんか
2020/06/28(日) 19:52:40.03ID:LbQBFJ/O0
>>48
EasyComm ってのに変えたほうがいいかも
2020/06/28(日) 20:30:15.72ID:LbQBFJ/O0
>>46
変更後のファイル名が重複するんじゃね
2020/06/28(日) 20:32:56.52ID:LbQBFJ/O0
>>46
あとファイルの種類によってはコメントが無いのもある
2020/06/28(日) 20:35:06.31ID:+IGHtKO4a
イジカミジゴー
2020/06/28(日) 20:39:46.50ID:yfJkjLDvM
>>48
Win32API直叩きしたら?
自分で全部管理できるし、枯れた技術で安定してる
2020/06/28(日) 21:16:46.93ID:yxdrwHPGa
>>52
B'z乙
2020/06/29(月) 10:38:25.17ID:2N59jCILa
excel標準でmscommの開発用のライセンス無いよね?
56デフォルトの名無しさん (アウアウカー 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列をコピーするときに空白のところまでで選択を止めて必要分だけコピーするにはどうすればいいですか?
2020/06/29(月) 14:21:14.85ID:81b3XCdqM
二次元配列を一つずつ取り出すときはArray(上からの番号,1)
空白行までのコピーは
with worksheets(1)
.Range(.Cells(1,3) ,.Cells(1,3).End(xldown)).copy
end with
2020/06/29(月) 15:29:59.45ID:TB+oeC/70
どういう配列が作られたのかがそもそもわかんないって話でしょ?

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

>>58
こんなのがあったとは・・・
活用させてもらいます、ありがとうございました
2020/06/29(月) 15:52:32.50ID:TB+oeC/70
仮想COM使ってるバーコードリーダーからEasycomm使ってデータ読み取ろうとしたけどわからんかった
その辺の知識身につけたいんだけどとっかかりが分からない
知識ある人がうらやましい
2020/06/29(月) 16:45:10.65ID:6d9dL1u1a
>>60
セルに入力するだけなら
USB接続のバーコードリーダーでピッピするだけ
いったい何のデータ?
2020/06/29(月) 17:04:47.20ID:TB+oeC/70
>>61
いわゆるキーボードモード(USB HID)になってるようなバーコードリーダーならそうなんだけどね

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

そこでなんとかCOMモードのままでHID的にエクセルに出力できないかなって。
NW7のバーコード読取り結果を出力させたいってだけなんだけど、うまくいかなかった
2020/06/29(月) 17:16:51.22ID:6d9dL1u1a
基幹システムとExcelが分離してるなら
キーボードを別のキーボードにするだけの事だから
数千円でUSBバーコードリーダー買ってきてぶっ刺した方が早そう
2020/06/29(月) 17:27:14.16ID:TB+oeC/70
おっしゃる通りなんだけど
そこに立ちはだかる「セキュリティ?」の壁なんだわ
特にハードは目に見える分、よく分かってないお偉いさんでも口挟んでくる
おれ超末端だからハード新規導入は無理だ
ソフトは誤魔化せるんでこっちから攻めたかった
65デフォルトの名無しさん (アウアウエー Sabf-PKxn)
垢版 |
2020/06/29(月) 17:37:54.02ID:6d9dL1u1a
それ、どっちがセキュアなんだかw

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

その先は知らん!
2020/06/29(月) 17:47:36.41ID:pfpn6QaF0
>>64
上司に黙ってソフト変更とかするほうがセキュリティー的にNGだろ
2020/06/29(月) 17:50:11.99ID:j9Yq0PlQr
業務時間も資産も使うんだし相談なり申請なりはしとけよ
2020/06/29(月) 17:50:20.02ID:TB+oeC/70
ちょ、そこで終わられても
2020/06/29(月) 18:01:00.81ID:pfpn6QaF0
うまくいかないって具体的なエラーや表示もないし
どこまでできて何ができないか書いてないよね
2020/06/29(月) 18:11:42.18ID:TB+oeC/70
セキュリティー的にはな、
でもうちのは「セキュリティ?」だから
>>69
一応何らかのデータは取得できてて、不正確な数字やらスペースやらは羅列される
まぁそもそも仕組み分からず動かしてる段階で自分としては納得出来てないんで
その辺を学習できるとっかかりが見つかればと思って書いてみただけ
心当たりなければいいよ
いそぐものでもないし課題の1つとして気長に取り組んでみるわ
71デフォルトの名無しさん (ラクッペペ MM4f-TKJB)
垢版 |
2020/06/29(月) 18:19:31.08ID:6uUvaw7SM
関係ないけどcomってコミュニケーションのCOMでいいんだっけ?

昔 .com をカンパニーだと思ってたワシ
2020/06/29(月) 18:42:30.00ID:6d9dL1u1a
>>70
データ変換はこのスレの範疇なようなスレチの様な
1次元のいわゆる白黒バーコードはバイナリだから
https://ja.m.wikipedia.org/wiki/シリアルポート
とキーエンスのバーコード講座NW7
https://www.keyence.co.jp/ss/products/autoid/codereader/basic-nw7.jsp
でもお勉強しないとわかりません。
2020/06/29(月) 18:57:10.02ID:2GVfwDQBr
>>70
通信パラメタ(とくにbps)は合わせたのか?
とりあえずシリアル通信についてちゃんと勉強してからやれ
2020/06/29(月) 19:27:50.46ID:TB+oeC/70
>>72
さんきゅ
目通してみる
>>73
パラメータはバーコードリーダのマニュアルに載ってたんでそれ使った

最後に試したのが1年ぐらい前なんで
そのうちまたやってみるわ
ほんとはバーコードリーダを家に持ち帰れればいろいろ実験できるんだけどなぁ
職場のPCだと手荒な実験できないんで捗らない
2020/06/29(月) 19:33:50.23ID:6d9dL1u1a
>>74
同じ品番のバーコードリーダーを買いましょうw
2020/06/29(月) 19:40:44.57ID:pfpn6QaF0
なんでわざわざコンプライアンスを破ろうとするのかわからん
2020/06/29(月) 20:58:53.82ID:p0BvfhePd
>>70
昔、そういうハードのサポートしてた。
POS関連でバーコ―ドリーダー、レシートプリンタ、何とかディスプレイ(金額表示)、キャッシュドロワーとか。

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

基本的に無理だから*2のに対しては/2のボタン
とか逆を割り当てていこうかと思ったら四捨五入で座礁しますた
記録して元に復元させるってやり方かぁ
ムズそうすぎてちょっとあきらめてる
使用者には間違えるなと言うしかないか…
2020/06/29(月) 22:35:48.51ID:6d9dL1u1a
>>78
間違えるないうようなユーザーフォームな時点でな
ロジカルなシンキングな出来てないな
2020/06/29(月) 22:40:32.32ID:R8I/2vyw0
>>79
ユーザーフォームのボタンの配置とか割り当てとかタブ分けとか悪戦苦闘してる
そこらへんのセンスがないんだよぁ
2020/06/29(月) 22:44:33.56ID:9POaIpQ1a
>>80
作業を分けてフローチャートを紙に書いてみた方が良いよ
頭の中の整理できるから
2020/06/29(月) 22:50:58.30ID:R8I/2vyw0
一応タブ分けしてみた
一番左はデータを指定したシートに全部読み込む

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

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

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

なんか工程毎にタブ分けしてみたけど
慣れないとみんな使いにくそう
なかなかなぁ
2020/06/29(月) 23:04:34.75ID:SxZPiP67a
>>82
作業工程ごとに選択肢が複数あって
それぞれに元に戻すボタンをつけるの?
囲碁や将棋ソフトじゃないんだからさ
しかも完成しても使いにくいとか
考えたくないくらいめんどくせー、わし降りた。
2020/06/29(月) 23:31:00.77ID:R8I/2vyw0
>>83
そうなんよ、±反転はまぁいいとして
四捨五入と最後のまとめ計算がなぁ…と
2020/06/29(月) 23:34:38.34ID:PVh3udJT0
操作する前に、シートをコピーして非表示にしとけば
戻すボタンでコピーしておいたシートに差し替えて戻すw
2020/06/30(火) 00:16:48.03ID:HFjntDoM0
間違えることくらいあるだろう
人間だもの
87デフォルトの名無しさん (アウアウエー Sabf-PKxn)
垢版 |
2020/06/30(火) 00:22:19.44ID:l6PnVpoXa
>>84
タブじゃなくてWordの葉書作成ウィザードみたいにしたらどうかな
アプリのインストールみたいに
順番に選択肢や入力欄があって
下にボタンで進んで行くイメージ[<<戻る][次へ>>][完了]
2020/06/30(火) 08:45:53.97ID:LUNyPqILd
>>84
根本的な考え方が違う。
フォームの内容を全部ユーザー定義かクラスに持たせて、そこ経由で動作させるようにする。
何かの動作はユーザー定義を元に動作させ、ユーザー定義をフォームに読み込むようにすれば簡単だ。
2020/06/30(火) 17:46:29.02ID:HFjntDoM0
普段からそういうの慣れてる人ならできるだろうが初心者に言っても無理だろ
2020/06/30(火) 18:08:03.74ID:ulIgP7Tu0
>>87
ありがとう、かなり見やすくかるかも
そのやり方でも作ってみるよ

>>88
ごめん、全く理解できん素人なので
教えてとは言えないからもう少しだけわかりやすく言ってもらえると
でも導入は厳しそうかなぁ
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
92デフォルトの名無しさん (ワッチョイ 4fe6-TKJB)
垢版 |
2020/06/30(火) 18:39:14.24ID:Z3NkR/bn0
数式張り付けろや
2020/06/30(火) 18:47:22.61ID:x94da/wE0
>>91
代入先がLastRow-1行1列の2次元なら配列もそうせんと
2020/06/30(火) 19:05:07.51ID:iUIa6Vpk0
>>93
すみません。書き方を教えてください
2020/06/30(火) 19:24:15.34ID:x94da/wE0
>>94
何の書き方?配列サイズを代入先セル範囲の行数と列数分用意するだけだぞ
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
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
2020/06/30(火) 19:47:07.61ID:s83lPCQk0
range.valueからできる二次元配列の開始番号は0ではなく、1ですねえ
2020/06/30(火) 20:10:45.24ID:iUIa6Vpk0
>>95,97,98
動きました!ありがとうございます。
2020/06/30(火) 20:21:46.34ID:h7LW9tmr0
0番目のセルは無いのに0番目の配列要素はあるから面倒臭いよな
2020/06/30(火) 20:28:40.73ID:x94da/wE0
場合によってはoffset(i)にすればよい
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

だと入りますが、できれば一括で置き換えたいので、正しい書き方を教えてください
2020/06/30(火) 20:53:49.15ID:x94da/wE0
>>102
入力先のセルは1列分なのにDayArrayは2列分あって2列目に年月日が入ってる
ReDimを見直せ
2020/06/30(火) 21:20:49.01ID:iUIa6Vpk0
>>103

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

DayArray(i - 1, 0) = MyArray(i, 1) & "/" & MyArray(i, 2) & "/" & MyArray(i, 3)
2020/06/30(火) 21:53:25.32ID:5LSCXiWjd
ListView(lvw1、lvw2)を2つ用意して、それぞれに同じデータを同じ順番に追加した状態です。
矢印キーの上下でlvw1とlvw2の同行選択状態ってどうやってやるんですか?
2020/06/30(火) 22:01:34.74ID:3GBrKjbXa
>>105
1と2で同じ操作をやりたいなら、別プロシージャに切り分けて(関数化)それをそれぞれに処理する方がわかりやすい
2020/06/30(火) 22:14:31.69ID:x94da/wE0
>>105
keydownイベントで上下の時になんやかんやする
2020/06/30(火) 22:19:33.56ID:x94da/wE0
操作に関わらず一緒でいいならchangeイベントで楽に済ませられるが…
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

昨日の俺です
こんな感じで四捨五入をしてる
やはり記録するかコピーしといて間違えたら戻す作戦かなあ
2020/06/30(火) 22:56:39.68ID:RrxBtxCBr
A列とB列にXYデータが書かれているファイルがある

このファイルが複数あり、データを縦にくっつけてひとつのファイルにする方法をお願い致します。
111デフォルトの名無しさん (ドコグロ MMc3-qQym)
垢版 |
2020/06/30(火) 23:33:01.16ID:ayj87xxdM
>>110
「vba 別のブック間 コピー」でググればそれなりの答えのサイトは出てくるよ
2020/07/01(水) 16:24:36.34ID:/ZTplk5x0
グラフの列の範囲を1つ進めて、範囲が変わったグラフを眺めてまた次の範囲を選択するマクロにしたいのですが、うまくいきません。
sleepで5秒待機するループにすると、マクロが終わるまでグラフはそのままです。
何か良い方法はありますか?
2020/07/01(水) 16:38:43.05ID:ufrQ+5Zi0
新しい表示にしてから待機したらいいんでないの
2020/07/01(水) 17:00:30.01ID:JVz0cdM50
DoEvents
2020/07/01(水) 17:01:38.04ID:wdJg4V2k0
眺め終わったら自分でボタン押す仕様にすればいい
2020/07/01(水) 18:02:59.35ID:cdm/n45Wa
眺めるってw
2020/07/01(水) 18:14:23.56ID:BGy1oUher
A列に上から1万個くらいのデータがある。

ある値以下なら行全体削除、上詰めにするマクロをお願い致します。


ググってもまとをえたのがなく困ってます。
2020/07/01(水) 18:21:37.82ID:ufrQ+5Zi0
>>117
作業列作ってある値以下なら1立てる→1でオートフィルタ→行削除
2020/07/01(水) 18:24:14.85ID:g4YauoQu0
>>117
どうせ暇なんだろ、1万くらい手作業でやれよ
2020/07/01(水) 18:24:43.29ID:v2a99oiHF
>>117
範囲をテーブルにする
条件に当てはまる行のa列から、データの入ってる最終列までClearContents
で、テーブルをある列基準に並び替え
2020/07/01(水) 18:34:27.89ID:5XfsDMDI0
wordをcomで操作しているんですが、基本的にcomは
同期処理できないんですか?
たとえば、よくあるprintout(wordVBAの)〜Set wordApp = Nothing
の流れなんかは、Application.Waitを入れないと印刷される前に
終わってしまいます。
122デフォルトの名無しさん (ワッチョイ 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
パフォーマンスは知らん
2020/07/01(水) 19:21:24.82ID:g4YauoQu0
そして動かないとか言ってくる初心者
2020/07/01(水) 19:44:41.54ID:l3YNJLMh0
deleteは重いわ誤作動起こしやすいわいいことないよな
2020/07/01(水) 19:59:04.37ID:fKGbFrld0
誤作動なんて起こすの?
単にセル番号計算ミスしたスクリプト書くだけなら理解できるけど、誤作動なんてあったら使えないな
2020/07/01(水) 20:06:30.76ID:Tir3cVcXa
フィルターかけてカレントリージョンでコピーして新規シートに貼り付けが良さそう
127デフォルトの名無しさん (ドコグロ MMc2-4eOZ)
垢版 |
2020/07/01(水) 21:01:32.84ID:v34eJavmM
>>122
(r,”A”)<ある値
顔文字に見えたわw
128デフォルトの名無しさん (ワッチョイ 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の指定カッコ内では数式を入れられないとかありますか?
129デフォルトの名無しさん (ワッチョイ 1eae-M/Ft)
垢版 |
2020/07/01(水) 22:17:29.48ID:H9TCgnXe0
Range(cells(a,1),cells(a,16)).Select
でやってみます
2020/07/01(水) 22:45:11.71ID:xxJ42X4qa
何故初心者はSelectしたがるのか
2020/07/01(水) 23:36:22.71ID:yn1qRX7nM
>>35
>>130
マクロの記録がその手のコードを生成するからでしょ
2020/07/02(木) 01:40:39.72ID:Y/spJvDG0
条件付き書式とかは?
2020/07/02(木) 02:34:51.75ID:G8g1bCvWr
このメニューで、空白セルにチェック入れると空白セルを選択しますね。

では例えば値が100以上など、条件つきのセルを選ぶ事はできますか?

https://i.imgur.com/zyDAZ0X.jpg
2020/07/02(木) 04:05:38.32ID:vmiMC9VK0
教えてください。
imagemsoの名称からfaceidに変換することは可能でしょうか?
もしくはmsoBarPopupでimagemsoを使用することは可能でしょうか?
2020/07/02(木) 06:28:30.74ID:PEAIWqln0
>>133
選んだセルをどうしたいかによるけど、オートフィルかけて選択とか
2020/07/02(木) 08:20:19.52ID:yX39WODNa
他人の作ったコードはなぜ読む気がしないのか
2020/07/02(木) 10:30:47.89ID:KAImZ3Owa
読む必要はないからな
138デフォルトの名無しさん (ワッチョイ 1e8e-0gyK)
垢版 |
2020/07/02(木) 12:31:17.08ID:cWLbwDw40
馬鹿の特徴

「教えて」「助けて」

で始まる書き込みをする
2020/07/02(木) 13:06:37.09ID:vmiMC9VK0
>>138
馬鹿でもいいです。
じゃあ、模範的な質問の仕方を教えてください。
2020/07/02(木) 15:30:35.30ID:NxUusdo6a
そんなものはない
2020/07/02(木) 16:07:39.62ID:fLeksvw30
>>140
ありがとうごさいました。参考になります。
2020/07/02(木) 16:13:40.59ID:pSHiLlcA0
馬鹿の特徴

人にマウントしたがるだけで
質問への答えは出さない
2020/07/02(木) 17:04:38.40ID:2Xt/GnSW0
>>142
馬鹿でもいいです。
じゃあ、模範的な回答の仕方を教えてください。
2020/07/02(木) 17:44:48.44ID:Q59tEF0c0
そんなものはない
2020/07/02(木) 17:45:12.17ID:q3lU8bAMa
そんなひとはいない
2020/07/02(木) 21:22:15.18ID:sbstkRF+M
馬鹿には馬鹿と指摘しないと、あまりに低レベルの自分でやってみようという意志もない馬鹿な質問で溢れかえるからこれくらいでいい
2020/07/02(木) 21:49:51.56ID:2Xt/GnSW0
>>144
ありがとうございました。参考になります。

>>145
消えろ
2020/07/02(木) 22:51:02.52ID:7/3Aifl90
ここが上級者ばかり集う高尚なスレだと思っているのかWWWWWWWWWWWW
VBAごときでWWWWWWWWWw
2020/07/02(木) 23:33:21.68ID:0km7hKfU0
VBAを随分下に見てるねえ。
別にC#で回答してもいいよ?
VBAに脳内変換するから。
2020/07/02(木) 23:47:09.16ID:Y/spJvDG0
上級者も馬鹿も両方いてあたりまえ
お前らそんなにマウントとりたいのかw
151デフォルトの名無しさん (ワッチョイ bb80-Rur7)
垢版 |
2020/07/02(木) 23:59:32.57ID:yXnL3NZ/0
誰か教えて。
式に=とか+を使うと字が読みにくくて困っています。
全角文字や絵文字を使うことはできないのでしょうか?
急いでいますからすぐに教えて、
152 テトリス ◆SYKnw8OJpw
垢版 |
2020/07/03(金) 00:10:57.30
テスト
2020/07/03(金) 00:14:47.41ID:P5PHrlsB0
>>151
一休さんかコロンブスみたいな回答で良いなら出来る。
実際に全角文字や絵文字で書いてみな。
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
2020/07/03(金) 12:58:30.06ID:KESc8IU30
そんなソース絶対読みたくないな

読みやすいフォント探すか自作すればいいだけだろうに
2020/07/03(金) 13:30:11.45ID:hUamHkOVa
ハズキルーペ使えよw
2020/07/03(金) 21:14:38.38ID:mplhmvvw0
ワークシートの条件にあう行を削除して上に詰めるみたいなことを、配列内でしたいです。

多次元配列"ary"内の1列目が66か、6列が1000か、28列目が空欄のレコードを削除するコードを教えてください
158デフォルトの名無しさん (ワッチョイ 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
と反転させたい
ってのは素人には荷が重すぎですかね?
2020/07/03(金) 21:31:07.37ID:DQKehNsV0
157,188
お互いに相手のコード相談しながら考えてあげればいいんじゃね
ちょうどよさげだわレベル
2020/07/03(金) 21:44:24.02ID:4NyCV/dB0
>>158
いいえ、がんばればできます
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
2020/07/03(金) 22:17:41.55ID:aUU6z7Ir0
そもそもマクロ作るのって違うデータでも同じ処理をやりたいような場合じゃないのか
一回限りのデータ抽出ならわざわざマクロなんか作る意味ないんだけどな
無駄に時間を浪費したいのかな
2020/07/03(金) 22:37:42.83ID:qSqs6yG50
使い捨てマクロってのもありまして
2020/07/03(金) 22:48:22.59ID:3J4wGhdX0
定型フォーマットの複数ファイルの同項目の値を集計したい
なんて時は使い捨てマクロかな
2020/07/03(金) 23:04:06.95ID:KESc8IU30
>>157
VBAの配列に要素詰める命令はなかったはずなので、どうしてもというなら
 該当要素より下の要素を一つずつ上にずらす
 最後の要素を消す
とやればできなくはないがお勧めはしかねる
2020/07/03(金) 23:06:05.89ID:KESc8IU30
>>158
それVBAじゃなくても計算式とワークの列使えばできると思うけど
なぜ素人がVBAでやろうと思うんだ
167デフォルトの名無しさん (ワッチョイ 8ab5-5DWS)
垢版 |
2020/07/03(金) 23:26:37.07ID:Mxid+JS90
>>161
構文エラーでしたわ
>>166
VBAでやりたかったのです…
2020/07/03(金) 23:27:55.78ID:8QUz9sdRa
確かに一回限りの作業なら
マクロ考えているよりやった方が終わってるかもな
2020/07/03(金) 23:35:20.76ID:P5PHrlsB0
>>157
配列内でやるならレコードセットだな。
2020/07/03(金) 23:42:57.67ID:9EQo/V7m0
一回きりだろうと同じ処理100回やるようなのもあるんだし
2020/07/03(金) 23:46:08.59ID:P5PHrlsB0
1回限りでも3行くらいで済むのは書くな。
172デフォルトの名無しさん (ワッチョイ 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
2020/07/04(土) 01:40:09.94ID:IOVEPry/0
一般論としては頻度の多い作業の方が自動化に向いてるのは確かだけど、
1回だけでも大量のデータを加工したり手作業でやるには時間のかかる作業もあり、
作業時間の方がコード書く時間より長くなる場合も多々もあるのでケースバイケースやね
174デフォルトの名無しさん (ワッチョイ 5301-JCxG)
垢版 |
2020/07/04(土) 01:58:21.07ID:42LT/T3f0
逆に、山田やっとけ、というのはどうよ?
2020/07/04(土) 02:07:27.87ID:VMWug14q0
やるとは何を?
176デフォルトの名無しさん (ワッチョイ 5301-JCxG)
垢版 |
2020/07/04(土) 02:09:15.54ID:42LT/T3f0
データの加工。
2020/07/04(土) 02:10:42.23ID:VMWug14q0
加工すればいいんじゃね
178デフォルトの名無しさん (ワッチョイ 5301-JCxG)
垢版 |
2020/07/04(土) 02:13:10.44ID:42LT/T3f0
いや、山田がやってくれないかなって。
だめ?
2020/07/04(土) 02:16:03.66ID:VMWug14q0
だから山田がデータを加工すればいいんじゃね
2020/07/04(土) 02:38:36.13ID:VMWug14q0
素人にやらせた場合間違った結果を出すかもしれんが
その場合頼んだ側にも責任があるけどそれでも山田にやらせるか?
181デフォルトの名無しさん (ワッチョイ 5301-JCxG)
垢版 |
2020/07/04(土) 03:10:27.15ID:42LT/T3f0
田中のほうが良いかな?
2020/07/04(土) 03:37:53.50ID:OxpkXjjxa
斎藤さんだぞ
2020/07/04(土) 04:04:04.69ID:IjVZd7O90
山田ができるのは座布団運びだけだろ
2020/07/04(土) 07:02:36.51ID:VZt6Ms3K0
do whileとかほとんど使わないわ
あれ試行錯誤してる最中に脱出条件間違えて固まるとイライラってするんで

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

なんてのやったが1回限りでもVBA使わないと無理。
というか普通に考えてVBAでも無理だけどね。
2020/07/04(土) 09:41:06.65ID:htrp3xgD0
>>157
配列に入れたら順番に書き込んで条件の時だけ書き込みスキップじゃ駄目なの?
187デフォルトの名無しさん (ワッチョイ 1e8e-0gyK)
垢版 |
2020/07/04(土) 10:01:18.86ID:1naoKVTK0
>>185
お前の低い知能の頭ではできないだけだろ
2020/07/04(土) 11:47:27.20ID:VZt6Ms3K0
簡単だよな
セルにどういう風にデータが並んでるかで多少の工夫がいるかもしれんけど
加減乗除のみのワンパターン
2020/07/04(土) 12:11:54.32ID:xB5SKVkx0
水口克也氏のExcelVBA入門講座って本を使ったことある人いますか?
最後のじゃんけんゲームを作る所が、どうしてもうまくいきません
2020/07/04(土) 12:23:35.41ID:KlM0EefbM
>>185
作業シート使ってExcelだけでできるんじゃね?
そもそも移動平均の平均とかあまり意味ないことやってる方が気になるけど
2020/07/04(土) 12:37:06.40ID:/jHrZd8o0
8時間平均から24時間平均への変換は一般的なLPF処理だな
デジタル信号処理で数値データを扱う基本的な考え方だよ
2020/07/04(土) 13:05:03.59ID:VZt6Ms3K0
>>157
全要素forで回しながら
条件合うものだけを新しい配列newArrayにいれていけばいいじゃん
その後新しい配列から、データ空にしたシートに記入

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

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

行削除によって表自体の体裁を上に詰めていきたいっていうなら
最初にforを回した後、元の行数とnewArrayの行数の差だけ表の行を削除
データはすでに配列にとってあるんだからどこから削除しても構わない
2020/07/04(土) 13:32:13.54ID:IjVZd7O90
>>191
それ一気に24時間平均でよくね?
2020/07/04(土) 13:43:57.26ID:/jHrZd8o0
いきなりデータ粒度を荒くするのは悪手
ましてや>>185の場合はじめに欠損データのノイズキャンセルも行っているのでまとめて行なうとデータの精度が低下する
2020/07/04(土) 14:05:30.25ID:Em2AcreDa
24コマを1コマにするんだから
平らに均すのに精度もクソも無い気がする
2020/07/04(土) 14:21:18.07ID:/jHrZd8o0
データ値の定常状態と過渡状態を理解していれば分かる
粒度が荒いと応答性が悪化するので現象の追従が遅れる
安定時のデータ値だけならともかくデータの変化を取りこぼすリスクが高くなるんだよ
2020/07/04(土) 14:31:13.19ID:Em2AcreDa
>>196
そりはモニタのアッパーとローワーにトリガー仕込んだら良い話ではないのでしゅか?
2020/07/04(土) 14:44:04.22ID:/jHrZd8o0
上限、下限決め打ちの場合はトリガ仕込むのでも通用はする
ただ一日当たりの変化量でアクション起こす場合はどうする?
移動差分(微分)を連続的にデータ処理しないと難しい
2020/07/04(土) 14:48:04.16ID:ZiXQ0AsVa
喧嘩はやめよう
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
2020/07/04(土) 15:04:44.69ID:xhESn47nr
はい
202デフォルトの名無しさん (アウアウエー Sa82-h0J+)
垢版 |
2020/07/04(土) 15:22:36.21ID:ZKMg5qK7a
>>198
地デジのようなリアルタイムデコードじゃなくて
過去に既に起こってしまったデータ欠損の過ちをVBA で穴埋めしようとしたたところで土台遅いと言う話でした。
>>199
そうですね
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)
これにブレークポイントつけてここに到達するケースがあるか調べてみ
それだけで何か分かるわ

まぁだれか正解のコード書いちゃうんだろうけど
デバッグ
ブレークポイント
これ使えないとまともなコード書けないぞ
2020/07/04(土) 15:38:09.49ID:VZt6Ms3K0
それだけじゃないからな
redim preserve は、くせ者
2020/07/04(土) 15:42:33.80ID:RSp2d2NT0
redimしなくても十分な量確保しといてどこまで使ったか変数に入れときゃいいだけだろ
わざわざ負荷かかることする意味がない
2020/07/04(土) 15:56:38.11ID:D9As6lACa
プロはとりあえず配列に格納するのが好きなんです
2020/07/04(土) 16:03:39.61ID:DEQjmcqBd
>>187
>>190
やって見てから言えよw
問題は時間だ。

2000x365x24x3=52560000

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

まあ、6時間もかけたく無かったからマルチプロセスにして1時間ぐらいにしたけどな。
2020/07/04(土) 16:04:11.08ID:qCMIttGKd
十分な量を確保

あとで失敗するパターン
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で出来たりするのかな?
2020/07/04(土) 16:22:41.23ID:DNEaiqy30
おれならそもそも案件をRDBMSに移す提案をするわ
だめなら元データはどうせCSVやJsonかなにかだろうし、VBAから普通にRDBにいれてプロシージャ叩くとか
外部プログラムで直に処理するね

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

>>210
おう、確かに元データはCSVだった。
SQLで上手いことやるのが思い付かんが。
2020/07/04(土) 16:35:45.74ID:qCMIttGKd
pythonでデータクリーニングさせれば?
2020/07/04(土) 16:42:21.08ID:IjVZd7O90
>>196
> 安定時のデータ値だけならともかくデータの変化を取りこぼすリスクが高くなるんだよ
平均とってる時点で取りこぼしとか意味不明なんだけどw
2020/07/04(土) 16:47:20.12ID:IjVZd7O90
>>207
2000列で高々3万行程度だろ
Excelの計算式はマルチスレッドで動くから自称「初心者じゃない」君のVBAより速いと思うぞ
2020/07/04(土) 17:02:54.82ID:DEQjmcqBd
>>214
バーカw
やってから言え。
本当バカだなあ。

そもそもファイル重くて碌に動かねえよ。
2020/07/04(土) 17:18:55.42ID:pfDbF4Mra
どうせ適当なデータでっち上げて表示させても気づかないだろ
2020/07/04(土) 17:35:53.50ID:oup49XFx0
>>203
おっしゃる通りでした。
IFに問題があったみたいです。ありがとうございました。
2020/07/04(土) 17:46:55.47ID:aRnpDm0b0
5ちゃんのExcelVBA質問スレでMonaさんに対してマウントを取りたいのですが、
Mount Mona
と記述してもマウントが取れません
どうすればいいですか?
219デフォルトの名無しさん (ワッチョイ 1e8e-0gyK)
垢版 |
2020/07/04(土) 17:49:24.23ID:1naoKVTK0
>>207
お前が馬鹿なだけだろ
全部メモリーに置く理由もない
己の頭の問題を仕様の問題とすり替えるな
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メソッドは失敗しましたになります。
2020/07/04(土) 18:14:15.70ID:DEQjmcqBd
>>219
出来もしないこと言ってるバカ?
それとも、それ迄のやり取りすら出来ないバカ?

手作業やExcel数式でやってから言え。
ちゃんとそれ迄のやり取りも読んでから言えよw
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次元配列にしてからシートに一括記入

なんかおれ間違ってる?
2020/07/04(土) 20:07:02.00ID:ZiXQ0AsVa
こうやって実際にやってみる人は素晴らしいと思う
2020/07/04(土) 20:15:53.04ID:/OqMGH1W0
>>220
matchならともかくcountifは配列に対応してない
素直にセルを引数にしてやったほうがいいのでは
2020/07/04(土) 20:17:12.12ID:JHoncA5/a
countifじゃなくてloopでfindにすればよいのでは
2020/07/04(土) 22:27:57.95ID:VMWug14q0
VBAは手段の一つ、目的はデータの加工ってわりきればすぐ終わる作業なのに
無理してVBAだけでやろうとするからいつまでもおわらない
2020/07/04(土) 23:58:08.33ID:DEQjmcqBd
>>222
ちょっと見た感じほぼ、俺と同じ感じだね。

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

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

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

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

多分読み込みよりも列を増やした二次元配列にして書き込みにも利用してたと思う。
2020/07/05(日) 00:48:44.07ID:poq4gvQsd
複数のファイルの名前を編集したい

具体的には、全てのファイルのファイル名に、2020と入れたい。
2020/07/05(日) 00:51:15.79ID:C4Jqu0Op0
DOSコマンドでできる
2020/07/05(日) 01:49:00.12ID:UMxIfgnY0
>>228
ファイル名のどこに入れるの?先頭?真ん中?末尾?
231デフォルトの名無しさん (ワッチョイ bfe6-s8sF)
垢版 |
2020/07/05(日) 01:59:51.75ID:S3+IlzuQ0
>>230
その程度vbaなら自由自在でしょ
バカにしないでください
232デフォルトの名無しさん (ワッチョイ 1e8e-0gyK)
垢版 |
2020/07/05(日) 02:04:39.40ID:sCEs+yW00
>>227
お前の書き込みは、
「というか普通に考えてVBAでも無理だけどね。」
だろ

後付けで時間がとか言い出して誤魔化すんじゃねーよ
2020/07/05(日) 03:08:45.12ID:EDU6Wt820
powershellでやれ
234デフォルトの名無しさん (ワッチョイ 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()を呼ぶ、って可能でしょうか?
2020/07/05(日) 07:16:23.84ID:2yUokYO9d
>>232
???
日本語が理解出来ないのか?

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

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

実際にやったが、普通はVBAでも無理という意味だよ。
>>222とほぼ同じで6時間かかるからマルチプロセスにしたんだからな。
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でやったらもっと酷いと思う
237234 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/05(日) 07:54:44.65ID:Mq9FuBzw0
>>234をグーグルで検索するには、どういうキーワードで検索すればいいでしょうか?
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
239234 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/05(日) 08:01:08.68ID:Mq9FuBzw0
>>228
ファイルをバイナリで読み込んで、バイナリで書き出す、
で、書き出す際に、ファイル名に"2020"&、とすればいい。
2020/07/05(日) 08:01:41.62ID:VaIdJVAp0
>>234
うん
>>237
vba 関数 呼び出し

偉いね、その姿勢があればすぐにプロフェッショナルだわ
241デフォルトの名無しさん (アウアウエー 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
242234 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/05(日) 08:05:40.42ID:Mq9FuBzw0
>>240
どうもです。
243234 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/05(日) 08:06:29.51ID:Mq9FuBzw0
>>241
どうもです。
2020/07/05(日) 11:36:58.35ID:CJtrxhlB0
>>242
呼び出しは、可読性考慮すると文頭にCall書いた方がいいよ
2020/07/05(日) 13:58:43.83ID:U1BgWcwt0
>>207
VBAでやっても6時間はかかりすぎな気がするが
マシンスペックとコード晒してみ

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

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

そういえばエクセルシートなりCSVなりに対してSQL投げる方法がいくつかあったけど
それは試したのか?
2020/07/05(日) 15:07:25.29ID:2yUokYO9d
>>239
ファイル名変更だから読む必要は無いだろ。
変更するだけでOK。
2020/07/05(日) 15:11:46.86ID:BTTSshKd0
>>244
おれもsubモジュール呼び出しはCallつけるようにしてる
他の言語いじったにあととかにVBAのその行みたらよくファッ!?って一瞬なるから
2020/07/05(日) 15:16:11.04ID:2yUokYO9d
>>245
SQLに投げるのは簡単だが、今回の問題でどういうSQLで出来るのかが分からんかった。
今でも思い付かんが。

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

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

細かい連携しないで済むようにしてたと思う。
複雑なことはやってねえよ。
2020/07/05(日) 19:59:50.06ID:Y6miK3VP0
>>224
いろいろ試してダメだったらそうします

>>225
ありがとうございます。そうします
2020/07/05(日) 21:27:28.28ID:2yUokYO9d
>>236
う〜ん、分からん。
俺もやってみたんだが、同じような時間だった。
観測値はテキ卜一に0〜100をランダムで書き込み。
観測出来なかった値は当時の記憶を頼りに9999とした。
確か9998もあったけど変わらんだろう。

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

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

どっちにしても後だしで申し訳ない。
2020/07/05(日) 22:26:04.09ID:ys79fvH60
>>251
そもそもいつ頃の話よ
うろ覚えだけど2010あたりから計算式はめちゃめちゃ速くなってるぞ
あとでかいブックは64bit化の恩恵もあるし
2020/07/05(日) 22:29:31.22ID:2yUokYO9d
>>252
調べたらそんなに昔じゃ無かったな。
2016年だった。
2020/07/05(日) 22:43:00.48ID:R1IME3L+0
ファイル名の先頭に、2020_ を付けるぐらい、robocopy で出来ないのか?
2020/07/05(日) 22:49:17.55ID:ys79fvH60
2016ならよほど変なことをしてないと数時間とかかからんと思う
2020/07/05(日) 23:53:51.99ID:C4Jqu0Op0
2020_2020_2020_2020・・・・
2020/07/06(月) 00:43:25.66ID:Cn1gvhVh0
officeが32bitだったというオチは?
2020/07/06(月) 06:39:12.08ID:NN5xIHVpr
workbookとworksheetって何が違うか。
2020/07/06(月) 07:15:30.65ID:5mzvDM1u0
キングジムファイルと綴じられてる一覧表って感じかな
2020/07/06(月) 08:12:33.04ID:XvhlV03D0
32bitと64bitで計算スピードの差は2倍もないような
2020/07/06(月) 08:39:32.35ID:NN5xIHVpr
Activesheet.cells(1.1).Activate
Activesheet.Paste

は上手くいくのに、

Activesheet.cells(1.1).Paste

は何でダメなんですか?
2020/07/06(月) 09:18:02.55ID:Ag715axD0
>>261
.pasteは、worsheetのメンバであってrangeやcellsのメンバじゃないから、かな?
2020/07/06(月) 09:49:31.89ID:Smcv6rvz0
パラメータ Destinationがあるから
ワイはPasteSpecialのほうが好き
2020/07/06(月) 12:08:40.63ID:0NryXgvDd
>>263
普通はCopyのDestinationでやるからな。
Paste使うのはRange以外のコピーの時かな。
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

の方が処理が早い傾向がありますが、そういうものですか?
2020/07/06(月) 19:08:39.04ID:tFUllOPh0
>>254
出来ないよ????
robocopy はファイル名の変更はできない。
robocopy したあと move するしかない。

…あ。こいつWSHスレを荒らしてたrubyおじさんじゃんww
2020/07/06(月) 19:10:33.89ID:tFUllOPh0
てか、もうRubyは徒花だったな。
人気もダダ下がりだし。
2020/07/06(月) 20:45:52.99ID:0NryXgvDd
>>266
よく分からんが、そもそも何でRubyが出て来るんだ?
VBAだってNameステートメントで一発なのに。
2020/07/06(月) 20:59:38.60ID:aGu/2bZb0
>>265
普通にかんがえて、前者のほうがループのオーバーヘッド分早いはずだが
その傾向ってのはどうやって調べたのか
2020/07/06(月) 21:12:06.08ID:tFUllOPh0
>>268
どこでもかしこでもRubyで書いて押し付けてきて、「出来だよ!」っていうオジサンがいるのよ。
WSHスレでは「Rubyおじさん」として有名だった。
が、自分よりスキルの上な奴がコードをうしたら黙り込む。
こんなところにまで出張いてるとはね…。

無視推奨。Rubyはオワコンだし。
2020/07/06(月) 21:13:16.26ID:K1goXTAAa
じゃあVBAはお爺ちゃんだろ
2020/07/06(月) 21:17:13.18ID:tFUllOPh0
>>271
VBAは「頼れるジジイ」だろ。何言ってんの?
2020/07/06(月) 21:29:12.52ID:XvhlV03D0
>>265
そんなのは処理による
コードが長くなったりループの中で扱うデータが増えるとメモリキャッシュがあふれて遅くなる可能性が高くなる
2020/07/06(月) 22:27:45.01ID:33E9zFJO0
Rubyの話がしたければRubyのスレ行けばいいのにね
2020/07/07(火) 12:27:17.68ID:mk51G87Dd
>>270
いや、それはRubyが優位と言いたいが為だろ。
全然優位じゃない所に出てくるのが分からん。
2020/07/07(火) 19:51:41.03ID:CAdbpiIn0
宣伝だろ
277デフォルトの名無しさん (ワッチョイ 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
2020/07/07(火) 20:25:40.74ID:BPFgnJg70
なんでVBAでやるの?
2020/07/07(火) 20:27:13.84ID:z4TbLErcM
VBAスレだから
280犬丸 ◆MRCYWQz4rc (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 20:31:41.96ID:2cf+0s2v0
>>278
和音の構成音(ドレミ・・・)を1つづつセルに入れられるから。
2020/07/07(火) 20:33:47.85ID:BPFgnJg70
なんでdominoとか使わないの?
282デフォルトの名無しさん (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 20:34:49.08ID:2cf+0s2v0
あと、PCにインストールされてる開発系はexcelだけだから。
283277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 20:41:28.24ID:2cf+0s2v0
つか、改変させたいmidiファイルが300個位あって、それの欲しいデータのexcelファイルへの読み込みはもう終わったわけ。
あとは、そのデータをちょい改変して、同様な300個のmidiファイルを吐き出すだけなんですよ。
284277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 20:42:49.00ID:2cf+0s2v0
だから、excelでバイナルファイルを作りたいのです。
2020/07/07(火) 21:00:27.95ID:yByKJQAn0
読み込めたなら反対をやればいいんじゃないの
2020/07/07(火) 21:05:07.15ID:CAdbpiIn0
>>283
著作権的にどうなの?
287277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 21:10:37.49ID:2cf+0s2v0
>>285
日本語だってそうだろ。
読むのは簡単。 書くのは大変なんだよ。

>>286
ネットで買った和音だけの簡単なデータで改変したデータを自分だけで使うぶんには問題ありません。
2020/07/07(火) 21:13:27.88ID:BPFgnJg70
じゃあそうすればいいじゃない?

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

> 所詮16進数の文字の羅列(Byteの配列とかにはさすがに出来てるんやろ?)
これがわからないんです。たとえば、4D 54 68 64という16進のデータをexcelの1つのセルに書き込む方法を教えて欲しいのです。
293277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 21:25:44.85ID:2cf+0s2v0
で、excelの"C3"に、4D 54 68 64を書き込んで>>277のソースを動かして試してみたいんです。
2020/07/07(火) 21:26:04.88ID:CAdbpiIn0
これなんか良いんじゃね
https://openmidiproject.osdn.jp/Sekaiju.html
2020/07/07(火) 21:29:51.89ID:CAdbpiIn0
midiの規格ってそんな簡単じゃないから素人が扱っても音が切れたりトラックがずれたりして
結局使えないだろ
2020/07/07(火) 21:32:34.47ID:7cSgkxva0
ExcelのRange#valueにバイト列なんか入るわけないんだから自分がわかりやすいように文字列か数値に勝手に変換して勝手に入れろとしか言えない
2020/07/07(火) 21:34:29.92ID:MaHOmhaOM
Excelでmidiデータを取り扱うなんて常人の発想ではない
たぶんあなた以外に誰も方法はわからないから頑張ってその道の第一人者になって欲しい
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つの文字列にする

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

これのおかげですべての可能性が広がったわ
301277 (ワッチョイ 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
こんなファイルを作るにはどのようなソースを書けばよいでしょうか?
302277 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 22:29:17.16ID:2cf+0s2v0
>>228
allrenameというフリーソフトを使えばいいのじゃ。
2020/07/07(火) 22:32:51.69ID:CAdbpiIn0
>>301
バイナリ編集のソフト使えばいいんじゃね
304301 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 22:42:26.54ID:2cf+0s2v0
>>303
すみません。 「VBAを使って」でした。
305デフォルトの名無しさん (ワッチョイ 0302-WfHi)
垢版 |
2020/07/07(火) 22:43:37.27ID:O/UE8zUS0
もはやExcelを使うことが目的化してる
2020/07/07(火) 22:44:27.22ID:yByKJQAn0
それもう読み込んだデータ無意味やん
フォーマット知らんけどセルに書き出せたんならファイルにもいけるやろ
307301 (ワッチョイ 8a01-c9XW)
垢版 |
2020/07/07(火) 22:54:30.10ID:2cf+0s2v0
>>306
基礎になるソースさえ教えてもらえれば、そこに色々付け加えてって自分に必要なバイナリファイルが作れるんですよ。
2020/07/07(火) 22:57:06.69ID:BPFgnJg70
まず書く努力をしよう
309デフォルトの名無しさん (スッップ Sdaa-DbYN)
垢版 |
2020/07/07(火) 22:57:22.32ID:0KBHODZEd
>>307
そろそろ死ねや
2020/07/07(火) 23:05:51.69ID:1TMQwlbY0
Excelの設定もAppDataの中身も場所も変えて無いのに、
下記のように表示されてマクロが読めません!

「起動フォルダーにある個人用マクロブックは記録のために開かれた状態でなければなりません」
2020/07/07(火) 23:09:31.21ID:exS2x9T+0
>>310
そのままググった
https://xtech.nikkei.com/it/pc/article/NPC/20070719/277869/
2020/07/08(水) 00:06:04.08ID:66yUE/saa
>>301
「'4D 54 68 64'」シングルかダブルで囲えば良いのでは?
「"4D 54 68 64"」
あるいは
いったんタブ区切りファイルtmp.tsvを途中で
中間ファイルとして介在させたらいいんじゃないですか?
2020/07/08(水) 00:14:08.99ID:4BPfKF9s0
ソースくれくれ君だからひんとあろうが自分で書かないよ、こういうやつ
314301 (ワッチョイ 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
315301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 01:49:45.50ID:gPwSdoJG0
つか、
ReDim BIN(Len(TEMP) / 2 - 1) As Byte
この部分が何だかわかんないんですよ。
まず、ReDimとは何だ?と。
316301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 02:05:21.42ID:gPwSdoJG0
目的は、
&H4D, &H54, &H68, &H54, &H68, &H64という6個のバイナリデータだけの、
1.BINというファイルを作りたい!
です。
2020/07/08(水) 03:08:12.79ID:F8fi/iH60
Excelでやる事ではない
以上です
2020/07/08(水) 03:11:39.83ID:F8fi/iH60
まずバイナリが何かすら分かってなさそうだしこの分だとmidiについても何も分かってなさそう
319デフォルトの名無しさん (ドコグロ MM43-jxlo)
垢版 |
2020/07/08(水) 03:24:41.69ID:llacuNM3M
ここで聞くより、「vba バイナリデータ」でググったほうが早そう
2020/07/08(水) 04:08:36.29ID:a4KGuVW5a
うちは会社のpcでバイナリ編集するのってセキュリティー的にアウトだし
2020/07/08(水) 05:18:34.50ID:hKBgVgLRr
この写真のように、例えば、3以下の数値をアクティブにする方法を教えて頂きたい

できれば、for next 構文はなしで

一発検索が望ましい。


https://i.imgur.com/EGujBbu.jpg
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のコードは全く意味がありません。
323デフォルトの名無しさん (アウアウエー Sa13-c9t6)
垢版 |
2020/07/08(水) 06:49:42.97ID:yrsbI81qa
>>321> できれば、for next 構文はなしで

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

複数のセルを選択する
http://officetanaka.net/excel/vba/tips/tips126.htm
2020/07/08(水) 07:11:29.93ID:x0V53xaA0
つーかわざわざselectする意味あんの?
2020/07/08(水) 07:47:38.02ID:8s/zJrIHa
わからないで書いてたのか
2020/07/08(水) 07:58:30.68ID:krt5VVG+d
>>316
簡単だろw
Dim btByte() As Byte
Dim lngFN As Long

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
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
2020/07/08(水) 08:09:09.54ID:krt5VVG+d
>>314
というかね、Variantとは何か、Byteは何かとか考えた方が良い。
扱える範囲が違うということはメモリ上のサイズが違うということ。
6個のバイナリって6Byteのファイルってことだろ。
Variant1個で16Byteだぞ。
329301 (ワッチョイ 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
330301 (ワッチョイ 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
2020/07/08(水) 09:23:12.29ID:yuZwXh1F0
>>330
>>307 > 基礎になるソースさえ教えてもらえれば、そこに色々付け加えてって自分に必要なバイナリファイルが作れるんですよ。
もういいやろ
332301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 09:32:29.70ID:gPwSdoJG0
つか、 FreeFile関数ってのがあるんですね 知らなかったw
333301 (ワッチョイ 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
2020/07/08(水) 09:40:18.98ID:R5JQxD1z0
>>332
つか、知らないことの方が多いくせに知ったかすんな
2020/07/08(水) 10:17:02.56ID:67N0qsNYr
>>333
「どこが悪いんだろ」
ではなく、
「下記のソースで実行すると〜というエラーが出ます。
 調べたところこのエラーの意味は〜と理解していますが、〜と修正したら今度は〜というエラーが出ます。〜〜」
と言ったように、自分でなんとか解決したいという姿勢がないとサポートなんてしたくならないよ

本当は誰も君の相手なんかしなくてもいいんだ
君は人の時間をいただこうとしてることを考えること
2020/07/08(水) 10:25:36.83ID:kC98LgO60
みんなやさしいよね
どこまでも相手してあげてるんだから
337デフォルトの名無しさん (ブーイモ MMeb-+b0N)
垢版 |
2020/07/08(水) 10:37:36.28ID:vI+4Hlt3M
ハゲてきました。
市販の育毛剤で試すとエラーが出ます。
調べたところミノキシジルタブレットが聞くと理解しましたが、それを買って飲んだら今度は心臓ドキドキの副作用がでて命が危険だそうです。
どうしたらいいでしょうか?
2020/07/08(水) 10:37:36.28ID:yuZwXh1F0
暇つぶしでしょ
2020/07/08(水) 10:38:40.26ID:yuZwXh1F0
時間丸被りとかあんのな
2020/07/08(水) 10:41:28.04ID:Fq6DmaU+0
>>333
C:\に変なもの置くな
2020/07/08(水) 10:53:24.76ID:Ywdztm8P0
つーか動的配列にする意味あんの?
342デフォルトの名無しさん (ラクッペペ MMcb-0WwX)
垢版 |
2020/07/08(水) 12:08:46.81ID:lp5P2pBOM
>>341
行間を読め
343デフォルトの名無しさん (ワッチョイ cb8e-edot)
垢版 |
2020/07/08(水) 16:22:19.40ID:0tPjVu1x0
だから最初に馬鹿はお断りしときゃいいんだよ
344301 (ワッチョイ 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
2020/07/08(水) 17:43:43.08ID:4BPfKF9s0
はい次の方
346301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/08(水) 17:58:35.88ID:gPwSdoJG0
>>341
midiファイルというのはサイズが決まってないんですよ
347デフォルトの名無しさん (ワッチョイ 2de6-0WwX)
垢版 |
2020/07/08(水) 19:59:20.87ID:7XVFoSLh0
>>344
そりゃVBAではなく、VBですらなく
BASICの範疇だからな

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

外部から開く際のコントロールは簡単ですが、自分自身でコントロールするのは無理ですかね?
Workbook_Openでいろいろ試したのですが、どうもこのイベントよりも先にダイアログが発生しているようで、、、
無理だ、という回答でもいいです。ご意見ください。
2020/07/08(水) 21:25:31.07ID:eeGZOJTWa
>>349
https://www.shegolab.jp/entry/windows-excel-read-only
2020/07/08(水) 21:41:34.04ID:eWJ0cHmK0
>>349
まずちゃんと自分で調べよう
知識が伴ってないのにろくに調べもしないでは自分で解決どころか調べ方すら身に付かない

まぁ、はなから自分でやる気なんか無いのかもしれないが
2020/07/08(水) 21:42:45.60ID:J4iDAbFT0
>>350
情報ありがとうございます。
リンク先のものはだいたい既知の情報でした。
やっぱり自ファイルでの処理は難しそうですね。
2020/07/08(水) 21:46:48.09ID:J4iDAbFT0
>>351
いや、ここに書き込むときは相当調べて最後の頼みのつなで書き込んでます。
調べよう、と仰るということは、何かいい方法をご存じですか?
2020/07/08(水) 22:00:15.73ID:wtc6YQgJ0
>>353
ファイルの関連付けを変えて、マクロで迂回して。。。

。。。ここまで来るとウイルス判定かも(詳しい内容は自粛します)
2020/07/08(水) 22:05:22.90ID:J4iDAbFT0
>>354
う〜〜ん、あまり危ない橋は渡らないでおきます。
2020/07/08(水) 22:32:26.07ID:R5JQxD1z0
>>353
調べ方を調べてから言え
2020/07/08(水) 23:26:10.17ID:J4iDAbFT0
>>356
じゃあ、
>>349の繰り返しになりますが、、箇条書きにしますね。
●Excelファイルをダブルクリックした際の挙動についてです。
  ** つまり、外部から開くケースは除外です。(こちらのコントロールに苦はありません。昔から使っています)
    「外部から」とは、具体的には、、以下のケースなど。
    ・ Workbooks.Openの引数で制御する。(VBSからのOpenも含む)
    ・ ContextMenuの"新規作成"で開く。
●他の人が開いていた場合のケースです。
  ** 最初に開いている人は編集・保存ができる前提です。
    → つまり、FileAttributeを最初からReadOnlyにするケースは除外です。
●上記の際の、[読専]|[通知]を聞いてくるDialogをバイパスしたい。
  ** 「最初から読専で開きたいわけではなく、誰かが開いているときは最初から読専にしたい」
    → つまり外部から開くケースにあたらない。
● 自ファイル側で判定したい、、、Workbook_Openで試したが、このイベントより先に
  ダイアログが発生してる。

>>349とほぼ同じ内容ですが、これだけ書けばどこまでの理解で何を試したか読み取れますか?
2020/07/08(水) 23:40:00.14ID:4BPfKF9s0
てかそんなんできたらマルウェアの温床になるから出来ないって思っとけよ
共有化でも足りないんならあきらめろん
2020/07/08(水) 23:44:27.92ID:J4iDAbFT0
>>358
よくわかりませんが、わかりました。
本件Closeで。
2020/07/09(木) 00:12:21.12ID:dz7PM5ALa
>>346
midiはファイルの種類じゃない
2020/07/09(木) 00:12:27.29ID:ylhvfSy00
ファイルが書き込めない状態になってたら読み取り専用で開けばいいだけじゃん
2020/07/09(木) 00:13:47.48ID:dz7PM5ALa
>>357
きもい
2020/07/09(木) 00:17:27.90ID:dz7PM5ALa
社会で他の人も使うファイル勝手にいじるなよ
2020/07/09(木) 00:44:28.03ID:HzjnRl+40
>>363
お前には聞いてないから大丈夫だよ。
じゃ、お休み。
2020/07/09(木) 02:16:40.71ID:eQo6hEQpa
>>364
おまえに言ってない
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/
2020/07/09(木) 03:59:15.57ID:uBlORkna0
taskkill /im ielowutil.exe
なんでもかんでもExcelでやろうとするな
368301 (ワッチョイ 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個ぐらい入れなきゃならないのです。
2020/07/09(木) 06:03:23.76ID:hGjJ3XRlM
ないです
次の方どうぞ
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
371301 (ワッチョイ 2301-6wWl)
垢版 |
2020/07/09(木) 06:37:41.14ID:C69oBRyL0
>>370
ありがとうございます。 感謝します。
2020/07/09(木) 06:38:57.33ID:pd2EiZRKd
文字列を使う方法2
h = "4D,54,68,54,68,64"
For i = 0 To 5
 btByte(i) = Val("&H" & Split(h, ",")(i))
Next
2020/07/09(木) 06:57:38.94ID:150ctWWia
エレガント?
2020/07/09(木) 07:48:49.30ID:3iI6FAhKd
>>368
そのエレガントな方法を考えるのがプログラミングなんじゃないの?
50個をコードでどうにかするなら、それをコードに書かにゃならんからエレガントにはならん。
別の所に持って良いなら別途ファイルを用意しとけば良い。
設定とか50個程度ならどっかのシートに書いとくとかでも良い。
2020/07/09(木) 07:58:21.56ID:8/Q//t/ar
ほんとコードくれくれ君は自分で何も考えないな
あげる方も頭おかしいが
2020/07/09(木) 10:13:45.21ID:tVMvaFoW0
激しく同意する
ちなみにバイナリを作成するやり方で実行ファイルが作れるのでウイルシなんかも作れてしまうわけだが
2020/07/09(木) 10:32:17.05ID:VstlXiSO0
モジュールから単体動作する関数を切り取って、別のモジュールにコピーしたのですが
変数の宣言がないとエラー表示されました。何度見ても宣言は正しくされているので?です。
新しく変数宣言して、置き換えると動作します。
こんなことあるのですか?
2020/07/09(木) 10:47:12.19ID:ylhvfSy00
>>377
変数?定数?
2020/07/09(木) 10:48:52.16ID:VstlXiSO0
すみません。変数ではなく定数(const)でした。
2020/07/09(木) 10:53:22.69ID:ylhvfSy00
>>379
グローバルな定数?
2020/07/09(木) 11:12:09.02ID:VstlXiSO0
ローカルです。
2020/07/09(木) 11:19:56.91ID:JYozEgDc0
option explicitの有無は?
2020/07/09(木) 11:21:50.10ID:DLLEuHaFa
>>376
みんなわざわざ煙に巻いてるのに言っちゃ
2020/07/09(木) 11:26:19.87ID:VstlXiSO0
>>382
option explicitはあります。
2020/07/09(木) 11:30:45.63ID:ylhvfSy00
>>384
稀に起こるが原因は不明
エラーになった定数の宣言行を切り取り貼り付けすればとりあえず治る
2020/07/09(木) 12:02:59.73ID:JYozEgDc0
コピペしたとき?
実行したとき?
2020/07/09(木) 12:29:25.07ID:VstlXiSO0
>>385
問題の行をコメントアウトし、その下に同様の内容を書いたら動作しました!
稀に起きるのですか。初めて遭遇する現象です。

>>386
実行時です。
2020/07/09(木) 14:14:55.78ID:VstlXiSO0
>385>386
他の箇所でも同様のエラー起きましたが書き直せば動作しました。
ありがとうございました。
389デフォルトの名無しさん (ラクッペペ MMcb-0WwX)
垢版 |
2020/07/09(木) 18:37:42.36ID:dhOVscThM
>>376
バイナリだからウイルスって意味不明

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

そもそも2進数じゃなくて16進数だ
2020/07/09(木) 19:27:38.21ID:0UE7wqUeM
まあイチからバイナリ書き出しで実行ファイ作れるような人はこんな質問しないけどな
2020/07/09(木) 19:41:37.34ID:WyUmT5e70
>>391
その脳内変換が意味不明
2020/07/09(木) 19:50:25.19ID:tq6y70T30
元々の変な質問のせいでくだらない流れになった

はい次の方
2020/07/09(木) 20:05:26.54ID:SKtauNRXM
VBAに将来はありますか?
2020/07/09(木) 20:11:04.35ID:F9SMopSBM
>>395
Excelと共に生き続けるだろうね
Excelの将来と同じ
2020/07/09(木) 20:13:33.30ID:K5359iyV0
そういえばExcelにPython載るって話はどうなったの?
2020/07/09(木) 20:29:37.44ID:Qt+epPmk0
VBA
https://docs.microsoft.com/ja-jp/office/vba/api/overview/

VSTO
https://docs.microsoft.com/ja-jp/visualstudio/vsto/office-solutions-development-overview-vsto

Officeアドイン
https://docs.microsoft.com/ja-jp/office/dev/add-ins/overview/office-add-ins
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をタスクキル
2020/07/09(木) 21:27:01.41ID:YMHQKg0aa
>>399
CreateObjectまんまオブジェクトを創造してます
2020/07/09(木) 21:31:09.68ID:36OHf5x10
New使っちゃいなよ
2020/07/09(木) 21:42:49.37ID:ylhvfSy00
>>399
参照設定をしていればいらない
2020/07/10(金) 10:20:58.35ID:O0QgyOqq0
>>397
OfficeやWindowsは開発者が妄想を公式ブログで垂れ流すのが恒例行事
それを公式発表だと世間が勝手に騒いでるだけ
2020/07/10(金) 13:53:04.16ID:3B5Gxm0d0
ExcelってIE制御からedge制御できるようになった?
未だにIEが一番使い勝手いいの?
405デフォルトの名無しさん (ワッチョイ 75f1-+b0N)
垢版 |
2020/07/10(金) 14:38:15.55ID:91NkPSzZ0
ExcelってChrome制御できるようになった?
2020/07/10(金) 15:03:43.58ID:DnP9bxpW0
いまはExcelがブラウザを制御するのではなくてブラウザがExcelを制御する方向性が主流
VBAはあくまでExcel内で完結する作業に限定した言語であって外部との連携作業はOfficeアドイン(実体はJavaScriptなどのスクリプト言語)や
VSTO(VisualStdioで言語はC#が中心)で行なうのがMicrosoftの方針
Pytonはよく分からんけど上手くOfficeAPIを利用すれば出来るかもしれない
概要についてのドキュメントは>>398
2020/07/10(金) 15:20:21.38ID:TbXdOMZ+r
てゆかブラウザ操作するよりAPI叩いたりスクレイピングするほうが主流よね、今は
ずっと昔はExcelで入力してIEに反映させるとかあったけど、今じゃレガシーすぎる
2020/07/10(金) 17:42:22.09ID:OUgIsXw30
ウチはシステムが古くてAPIなんてものに対応してないので現役だわ。
2020/07/10(金) 20:17:34.10ID:R/wZjJlU0
人間も古いからちょうどいい
2020/07/10(金) 21:41:25.81ID:rd+FvU1jd
>>407
API叩くのもスクレイピングも変わらんけどな。
何でやるかの違いくらい。
まあ、Chrome制御は出来んけどな。
WebDriver使えるから出来るとも言えるか。
何処から何処迄がExcelって話。
2020/07/10(金) 21:42:22.54ID:rd+FvU1jd
>>406
VSIOは寧ろ廃れてるような気がするが。
2020/07/10(金) 21:42:47.24ID:rd+FvU1jd
>>411
VSTOな。
2020/07/10(金) 22:02:00.46ID:c4ANmjzxa
>>412
VIOな
414デフォルトの名無しさん (ワッチョイ 75f1-+b0N)
垢版 |
2020/07/10(金) 22:39:50.15ID:91NkPSzZ0
>>413
それはちん毛ちんこケツの穴のことだ
2020/07/11(土) 00:41:33.92ID:vLv3KjHj0
あかん、モーむり
sendkeys使いすぎてるせいで
Numlockキーがオンになったりオフになったり・・・
かと言って必ずオンオフ切り替わるかというとそうでもないし
誰か絶対100%常にNumlockオンになるコード教えてくれえ
416デフォルトの名無しさん (ドコグロ MM93-jxlo)
垢版 |
2020/07/11(土) 01:11:16.23ID:2VuM3xocM
>>415
vbaでレジストリを操作できるから、そこに道があるかも知れない
2020/07/11(土) 02:13:29.34ID:Eg2/WlgT0
>>415
2 つ以上の SendKeys ステートメントが連続して実行されると、NumLock キーがオフになる
2020/07/11(土) 02:29:45.71ID:6j9f8L+G0
>>415
https://santane.jp/wp/?p=355
2020/07/11(土) 09:37:08.18ID:vLv3KjHj0
ありがとうございます
418の方法も試したんですが、なぜか一回目では適用されず
あと418の一番下にある、入力リストを展開するとは一体?
2020/07/11(土) 10:30:37.96ID:R2Hyt8Cad
>>415
Sendkeys使う奴は糞。
絶対に使っちゃいけないと言った方が事故が起こらないくらい事故が起きても不思議じゃない所で使う奴がいる。
421デフォルトの名無しさん (ワッチョイ 75f1-+b0N)
垢版 |
2020/07/11(土) 10:36:45.99ID:QNz3pRQ00
糞!ですか
2020/07/11(土) 10:40:32.24ID:VwbCqtVvM
何年前からのバグなんだろうねこれって
2020/07/11(土) 10:45:18.55ID:R2Hyt8Cad
>>421
Sendkeysは基本的にコントロール出来ない。
他アプリを操作するにはもっとコントロール出来る方法がある。

どうにも出来ない時は仕方がないが、絶対に使わないつもりで、どうにもならない時だけ使うべきだね。
2020/07/11(土) 10:51:22.16ID:R2Hyt8Cad
あと、危険は承知でちょろっと使う時はある。
お手軽だから。

でも、それで使うことを許容すると危険もしらず、ちょろっとで済まない所で使う奴が出てくる。
2020/07/11(土) 11:53:42.98ID:vrrLv2a80
Excelを頼りすぎ
2020/07/11(土) 11:59:27.85ID:8xOOoQBua
Excelで恋愛相談から今晩のおかずまで
2020/07/11(土) 12:25:50.11ID:DdDKJrYh0
sendkeysって手段としてしょうもなさすぎるんだよな
目的を整理すれば他にもっといいやり方があるはず
2020/07/11(土) 12:40:05.09ID:pqxpyZgt0
キーワードによる予測変換機能っぽいのをやろうとしたときに、
いいコード無いか探してたら使ってたなsendkeys
429デフォルトの名無しさん (ワッチョイ 75f1-+b0N)
垢版 |
2020/07/11(土) 13:02:10.38ID:QNz3pRQ00
糞!
2020/07/11(土) 13:57:47.97ID:6j9f8L+G0
確実にコントロールしたいならAPI
https://www.vba-ie.net/code/numlockon.php

まあAPIも万能じゃないんだけど、今回はとりあえず使える
2020/07/11(土) 14:02:53.27ID:R2Hyt8Cad
>>430
いやいや、確かにSendkeysよりは良いけど、何でキーボードシュミレートしたいのよ。
オブジェクトに直接キーを送るとか、オブジェクトの動作そのものを実現するとかは無しか?
2020/07/11(土) 18:21:43.63ID:2M7rjl8q0
大抵のアプリは外部からの要求を受けるのはマウスとキーボードだけだから
433デフォルトの名無しさん (ワッチョイ a346-s8xH)
垢版 |
2020/07/11(土) 18:52:58.44ID:6knL1xMy0
あ、ちょっと失礼。
ほんの少し前、テキストボックスに入力された数式をだったか
マクロだったかをプロシージャにして実行するってなことをやってたんだが
すっかり忘れてしまいました。
どうやるんでしたでしょうか。

OS;Windows 98
Excel 97
2020/07/11(土) 19:37:48.81ID:Nux+IN340
>>418
そんな不具合見たことないな。
VBA限定で、VBSから使うと出ないとか?
435デフォルトの名無しさん (ワッチョイ cb8e-edot)
垢版 |
2020/07/11(土) 20:21:11.98ID:UiWBFlGj0
>>433
死ね
2020/07/11(土) 23:15:56.45ID:vrrLv2a80
>>433
そのうち思い出すから
2020/07/12(日) 08:33:32.60ID:lihdyx4V0
>>433
Application.Run
2020/07/13(月) 14:37:54.03ID:1lzMxcCPM
sendkeys問題解決しました
ありがとう!create object wscript.shell.sendkeysでうまいこと行けた
439デフォルトの名無しさん (ベーイモ 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
2020/07/15(水) 02:33:14.34ID:ZAnqbcST0
Excelでやることか?
2020/07/15(水) 04:42:17.63ID:IqfNcqeZ0
>>439
5ch では、同じ質問のマルチポストは禁止です!

もう1つのスレの方で、やってください!
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回ほど続くんですか簡潔にかけませんか?
2020/07/15(水) 05:28:08.89ID:jQlbMrrka
え?VBAって二重ループ出来ないの?


エクセルVBAの二重ループについて
https://oshiete.goo.ne.jp/qa/7136635.html
2020/07/15(水) 07:31:51.88ID:e63KSG0L0
再計算をオフにしていても、VlookupとかIndex/Matchで参照されているセルを削除すると初回だけ滅茶苦茶重くなる
二回目からはアンドゥしようが削除しようが一瞬になる
この初回も重くならないようにしたいんですけど、初回だけどこかで再計算か何かが裏で動いてるんでしょうか?
2020/07/15(水) 07:50:23.17ID:XJ3hJcChM
プリンタに接続してるんじゃね?
2020/07/15(水) 08:49:05.20ID:vPDzR3td0
記念パピコ
447デフォルトの名無しさん (アウアウエー Sa02-l+/r)
垢版 |
2020/07/15(水) 09:01:25.32ID:yrzZGj8Ca
ちゅーちゅーちゅぶりらチュパカブラー
2020/07/15(水) 17:34:47.36ID:vYR4+hKTa
テーブルの特定列に入力されている値から選択できるドロップダウンリストを作りたいです

【要望】
・重複なし
・(できれば)空白は除く
449デフォルトの名無しさん (ワッチョイ 768e-3Ffi)
垢版 |
2020/07/15(水) 17:39:29.54ID:yeW9Dlh/0
>>448
そうか
頑張れよ
ここは日記お断りだぞ
2020/07/15(水) 17:39:30.37ID:mQ5xmDA6a
>>444
キャッシュのなら場合そういう動作が正常
2020/07/15(水) 19:30:17.20ID:FYD4rmMFM
>>448
これがゆとり世代だ
2020/07/15(水) 20:33:22.18ID:1MtMgQ04F
質問してるじゃん
俺は答えられないけど
453デフォルトの名無しさん (ワッチョイ 05f9-eubO)
垢版 |
2020/07/15(水) 21:01:28.16ID:XJthZBxP0
「作りたいです」という決意表明だろ?
そう言えば誰かが勝手に手助けしてくれると思ってるのかね。
あ、本人かよ。
454デフォルトの名無しさん (ワッチョイ 0d01-aTVc)
垢版 |
2020/07/15(水) 21:25:35.44ID:sBHz+ETb0
平成生まれと昭和生まれは少々使用する言語が違う。
同じように日本語とは言うけれど。
2020/07/15(水) 21:35:02.16ID:8IhCO+GMM
ゆとり世代は誰かが助けてくれて当然と思っているからな
456デフォルトの名無しさん (ワッチョイ 0d01-aTVc)
垢版 |
2020/07/15(水) 21:38:36.33ID:sBHz+ETb0
そこら辺は見た目の影響も大きいんだよな。
イケメンだったり可愛かったりすると、助けてもらえるのが当たり前で生きてる。

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

そこら辺の感じ方が違うのは当然なんだよね。
2020/07/15(水) 22:18:05.17ID:onU8sBQ+a
俺じゃない誰かが助けてくれるんじゃね
458デフォルトの名無しさん (ワッチョイ dab5-t9FD)
垢版 |
2020/07/15(水) 22:44:18.56ID:ovUS+LpM0
覚えてものにしようと断固たる決意でマクロを完成させたけど
最初の方に組んだプロシージャを今見てもほとんど覚えてないわ
メンテナンスだけはできるようにコメントつけてあるけど
これがネットで拾い集めて基礎を学ばない相変わらずの俺のダメスタイル
2020/07/15(水) 23:23:50.74ID:xZi/KI4S0
コメント残してるだけだいぶマシ
460デフォルトの名無しさん (ドコグロ MM0d-HVEE)
垢版 |
2020/07/16(木) 00:53:10.42ID:9MD/+BL5M
個数や最終行などよく使う変数名は今後の為に統一させたほうがいいな
その時の気分でいろいろと変えると後で意味不明になる
2020/07/16(木) 02:52:22.64ID:OfRWrGue0
古いソースをコピペするからそうなる
2020/07/16(木) 09:14:27.30ID:PzZafv3e0
そして統一後気が変わって全て置換か
2020/07/16(木) 09:39:51.11ID:6lIeM5zt0
何の変数かコメント付けるだけで十分では
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
2020/07/16(木) 12:20:55.35ID:Bld7disAr
いらん列を消せば?
2020/07/16(木) 12:29:13.40ID:GzNgEuWKM
みんなvbaどうやって勉強してるの?
しっかり参考書とか買って、じっくり?
ちなみに自分は>>458に近いスタイル
必要に迫られたらネットで検索して、ちょっと弄ってって感じ
だからいつまでたっても上達しない・・・
2020/07/16(木) 12:41:43.01ID:Bld7disAr
消したらrange("a2").resize(i,6)
2020/07/16(木) 12:45:12.35ID:6lIeM5zt0
コピペするだけで身に付くわけがない…
そのコードが何をしてるのか理解できるまで調べて自分で使っていれば自然に身に付く

>>464
いらん列消すか、いる列の2行目から地道に入れる
469デフォルトの名無しさん (ブーイモ MMa1-t9FD)
垢版 |
2020/07/16(木) 13:00:26.82ID:jRyYUilTM
これできるようにしてくれない?
これって自動でならない?
職場の糞どもの質問は完全に無視してる
テメーの昼休憩にずっと触ってるスマホで調べりゃ出てくるだろ
話しかけんな
2020/07/16(木) 13:38:13.07ID:PzZafv3e0
その人が楽するためなら何もしないな
あえて普段はどうやってるか聞いてみて嫌な顔一つしない感じならやる
471デフォルトの名無しさん (ワッチョイ 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

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

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

あと配布した途端楽になったらその業務ばっかりやろうとするおっさん見苦しくてむかつく
配って損したわ
2020/07/17(金) 08:36:30.29ID:KHrOLv580
あれ?ここ日記帳だっけ?
2020/07/17(金) 09:55:37.13ID:q+bHJv+q0
みんなの日記帳だよ
君も自由に書き込んでいいよ
2020/07/17(金) 11:03:50.73ID:lcXPd8bd0
>>465,468,471
ありがとうございます。列を削除して取り込みます。
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"
2020/07/17(金) 12:02:43.77ID:0sNlDakf0
型はなんなの?
くそコードでもいいからひとつずつ考えて作ってみたの?
2020/07/17(金) 12:07:44.33ID:NYWT4Zhl0
の場合、とか言ってるんならif使えばいいだけだろ
アホなのか
2020/07/17(金) 12:46:43.52ID:0sNlDakf0
書いてみた
理解しなきゃ使えないと思うが


https://i.imgur.com/3Ynd7KW.png

https://i.imgur.com/5mFzai4.png
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")
2020/07/17(金) 21:27:08.31ID:27Ma2AbZ0
来年の役員報告の課の改善発表の内容に
俺のマクロで作る事が既に組み込まれてるんだが
そもそもそこまでスキルないし年上のもっと給料もらってる奴にやらせろやカスが
2020/07/17(金) 23:08:06.59ID:Bh4mGSGka
って言えばいいじゃん
2020/07/18(土) 15:07:16.47ID:aMbjCCwU0
日本語環境でmiLANG_JAPANESEを指定してもbad languageのエラーが出るのは何故?
2020/07/18(土) 16:11:19.98ID:gXGI8VY40
敗戦国だから
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
2020/07/18(土) 19:22:36.82ID:BZh66Ti/a
>>485
そりゃあ貴方、ary2は関数ですと自分で宣言してるもの。
しかもary1に代入してますやんかー
プログラムは命令通りに動作してるだけじゃん。

ary2の配列を準備して処理してから
そのary2の内容をシートに展開すようにプログラムしなきゃ
2020/07/18(土) 20:24:50.23ID:6ntZQZs40
>>486
ありがとうございますFuntionの使い方を誤解していましたm(_ _)m
2020/07/18(土) 22:33:50.97ID:6aEbh+KL0
Function大魔王
489デフォルトの名無しさん (ドコグロ MM0d-HVEE)
垢版 |
2020/07/18(土) 22:50:59.73ID:GbMN9IfrM
>>485
Functionの配列渡しは少しややこしい
まずは内容を単純化して正解の型を見つけた方がいいと思う
490デフォルトの名無しさん (ドコグロ 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
2020/07/19(日) 01:27:51.35ID:YQjQ9IMi0
配列の扱いや参照渡し以前の問題では・・・
492デフォルトの名無しさん (ワッチョイ 768e-3Ffi)
垢版 |
2020/07/19(日) 02:51:36.02ID:b8b+mHAS0
結局、馬鹿には無理なんだよ
2020/07/19(日) 02:54:31.21ID:MOwnlnDY0
joinして受け渡ししてsplitで復元がシンプルでわかりやすいんじゃね?
2020/07/19(日) 06:42:33.41ID:xggXZiaY0
もう企業ユーザーにはOffice Script解放されてるみたいですが試された方、使用感どんなもんですか?
2020/07/19(日) 08:30:43.83ID:du465xO70
調査してる最中じゃねーの、あわてんな
2020/07/19(日) 14:09:46.91ID:4shkrYfWd
>>485
ary2の宣言部分は正しい。
でもary2の内部でary2はどうなったの?
何もしてないよね。
ary2の内部でary2はこうなりましたって書かないと宣言した時点の空の配列が返るのが当然。

つまりary2のFunctionの最後にary2=の文が必要。
2020/07/19(日) 14:11:26.48ID:4shkrYfWd
>>490のfnc=any()の文が正にそれ。
2020/07/20(月) 12:06:47.51ID:Dkhdkwhma
excelなんだから配列はセルにいれときゃいいんじゃね
2020/07/20(月) 18:29:09.95ID:3yLiDe7EM
速度気にしないなら
2020/07/20(月) 23:22:10.32ID:87nc/Vc+0
全然気にしない
2020/07/20(月) 23:52:01.41ID:3H73W2vZ0
配列は大量に入れるとメモリ不足になるのが嫌。
値以外のプロパティ持ってるセルの方がよっぽどメモリ喰うだろって思うけど、
仕様だから仕方がない。
2020/07/21(火) 07:20:28.10ID:s4f7WPjJd
メモリ不足になるほど大量に入れることなんて殆ど無い。
不足するのは別の理由だと思うが。
2020/07/21(火) 10:31:44.78ID:8QcWJiTk0
10万行のCSVとか配列で処理したくなるけどメモリ不足になるんで仕方なくワークシートに入れてる
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
なら問題ない
2020/07/21(火) 11:43:12.61ID:uXgtcpNna
intの最大の32767だろうね
2020/07/21(火) 12:27:55.57ID:Z8jTNyVcM
オフィススクリプト試したい…
個人ユーザーにも解放してくれ…
2020/07/21(火) 13:35:34.68ID:420tjBmwd
csvを文字列形式のセルに取り込む時、値がない場合は""とemptyどっちにしておくべき?
508デフォルトの名無しさん (ワッチョイ 7df1-+aB8)
垢版 |
2020/07/21(火) 14:38:12.66ID:zc+r4po80
office田中の人が顔出しでYoutubeはじめたらしいが
おじいちゃんで偉そう。
実世界なら関わりたくないタイプ。
2020/07/21(火) 19:47:20.41ID:g0ULgQg00
ネット上でも関わり合いになりたくないタイプだろ
2020/07/21(火) 21:24:07.75ID:fmBf+klc0
自分の参考になるとこだけ聞いときゃいいんじゃないの?
その他アレコレ言うのはどうかと思うぞ
2020/07/21(火) 22:50:12.29ID:nbzaQebba
>>503
1レコードずつシーケンシャルに処理できないの?
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で消えてしまうので
そういった場合に備える意味も含めていい方法があれば教えてください
513デフォルトの名無しさん (ワッチョイ ee8c-sTnA)
垢版 |
2020/07/21(火) 23:08:39.79ID:aJyp0F9S0
Excel2019です
外部CSVをpowerqueryで取り込んで整形したのちシートに貼り付けてあるテーブルがありまして、
ファイルを立ち上げる度にこのテーブルを自動で更新させるところまではできました。
この後、更新完了後に自動的にCSVファイルを保存、終了させようと考えているのですが
更新完了のイベントがどうもわかりません(見当たりません)。

アドバイスをいただけないでしょうか
よろしくおねがいします。
2020/07/21(火) 23:15:37.99ID:rncf75Mgd
>>513
スマートさは知らないが正規表現で置換するとか
2020/07/21(火) 23:16:26.19ID:rncf75Mgd
間違えた
>>512
2020/07/22(水) 01:35:45.12ID:2/9nnKBr0
>>507
null 値は文字列型じゃなく、
型もない、または、null型だから、空文字列ではないと思う

>>513
>このテーブルを自動で更新させるところまではできました
この処理の後に、やりたい処理を書けば?
2020/07/22(水) 02:45:59.48ID:V5aeR2xw0
>>512
/^\|+|\|+$//
/\|+/|/
518デフォルトの名無しさん (ワッチョイ 29f1-4Yr4)
垢版 |
2020/07/22(水) 03:16:01.58ID:hQWVf2dN0
>>517
v(^^)/~
2020/07/22(水) 03:56:58.93ID:F4KuFXOj0
>>511
ファイル操作はセル操作以上に重いからできるだけまとめた方が速くなる
2020/07/22(水) 08:03:26.55ID:eX+7X9u9a
>>519
そう?
2020/07/22(水) 08:33:57.99ID:6gIpTQrUd
>>503
10万を一気に配列に入れるの?
5000行ぐらいずつで処理できんの?
2020/07/22(水) 08:40:56.01ID:6gIpTQrUd
>>512
1.連続する|を1つにする。
2.両端の|を消す。
523デフォルトの名無しさん (ワッチョイ 0963-VaRO)
垢版 |
2020/07/22(水) 16:49:33.87ID:aRPEdkhK0
ExcelWebAddinっていうのを使ってWebフォームの入力を自動化しようとしていますが、ラジオボタンにチェックを入れるにはどのようなコマンドを入力すれば良いのでしょうか?
2020/07/22(水) 17:06:35.37ID:F072B1Mr0
1人だけマクロ作って超楽に終わらせてるのがバレたわ
改善提案で出して8000円賞やるから他の奴らにも配って共有化してくれと言われた
まぁ仕方ない
でもまぁマクロはこっそり作って自分で運用するに限るね
次にそういうのできたら発表で使ってくれだと
2020/07/22(水) 17:17:55.78ID:nFYyDION0
こっそり使わないと
マクロ適用できないように仕変されるよ
2020/07/22(水) 17:25:20.04ID:F072B1Mr0
Excelを使った業務が95%くらいの職場だから問題ない
逆に使いにくいwordを俺が改善で駆逐していってたが今回のはみんなに配りたくなかったけどまぁ仕方ないか…
在宅の日なんて他の人が半日かかるのを5分だったのに…
2020/07/22(水) 17:55:11.21ID:vvOOySn70
>>524
そういうのさあ、共有してあげてもいいけど、共有すると知的障害の人が仕様の異なるものに適用して失敗して文句言ってくるのが目に見えてるんだよね
だからといっていろんなケース想定してプログラミングするのはアホらしいし
2020/07/22(水) 18:47:51.04ID:urXipo8c0
むしろあえて自分用に最適化して「共通部分以外はできません」でもいい
2020/07/22(水) 19:56:15.37ID:nFYyDION0
いつのころからかマクロを忌み嫌い極限までVLOOKUPで済ませるようになった
2020/07/22(水) 19:58:49.72ID:ILXZvJ+B0
index/matchは使わないのw
531デフォルトの名無しさん (ワッチョイ d1e6-l24t)
垢版 |
2020/07/22(水) 20:03:08.77ID:SXXgaLVH0
オレオレ証明書でスムーズに使えるかと思ったら
証明書付けると逆に使えなくなったり
嫌がらせが半端じゃなかったしな
今では設定がどこにあるのかすら分からん
2020/07/22(水) 21:55:35.93ID:F4KuFXOj0
XPの頃はオレオレ証明書を作ってたけど、そういや今は作らなくても動いてるな
何がどう変わったのか把握してないわ
2020/07/22(水) 22:08:08.79ID:Fc7dRB3XM
今ならxlookupがある。

あと関係ないけど、スプシのquery関数輸入してくんないかなぁ…あんなのに特許とか無いでしょ?
2020/07/23(木) 02:13:32.09ID:Iky/Pkwz0
あるだろう
使われてないけど
2020/07/23(木) 02:31:09.52ID:KC5IdKq10
シートのコード名をマクロから変更することはできますか?
2020/07/23(木) 02:32:42.56ID:vlSabEZu0
できるわけないだろ
2020/07/23(木) 02:42:45.18ID:KC5IdKq10
まじか!
2020/07/23(木) 02:44:48.35ID:hi69YBSQa
シートのコード名ってなんだ?
2020/07/23(木) 02:46:02.22ID:vlSabEZu0
プロシージャ名じゃね
知らんけど
2020/07/23(木) 02:50:40.32ID:hi69YBSQa
設定を変更する必要はあるけど、VBproject を編集できるかもね
2020/07/23(木) 03:09:52.56ID:u9f9fzuBr
>>535
値取得のみ可
https://docs.microsoft.com/ja-jp/office/vba/api/excel.worksheet.codename
2020/07/23(木) 03:16:02.13ID:togpUAVc0
>>526
もしかして長文資料もExcelで作っちゃう系?
それはそれで絶対やめとけよ
2020/07/23(木) 03:21:02.63ID:KC5IdKq10
>>541
やっぱり値取得だけなんですね。
ありがとうございました。
2020/07/23(木) 07:12:45.90ID:i+261XKMd
>>543
何で変えたいの?
545デフォルトの名無しさん (アウアウエー Sae3-Ar/h)
垢版 |
2020/07/23(木) 07:16:32.96ID:kdPZXO8Ra
世の中が気に入らないから
2020/07/23(木) 07:23:13.06ID:Rh3868Eja
手入力でやれよ
2020/07/23(木) 07:35:31.90ID:LqjC2Hh/0
sendkeyでなんとか
2020/07/23(木) 10:55:22.67ID:zKEjLf2X0
>>517
ありがとうございます、休み明けに試してみます
549デフォルトの名無しさん (ワッチョイ 4901-It4W)
垢版 |
2020/07/23(木) 11:56:15.16ID:5yzO6ql90
Android版のアウトルックが操作方法また変わって、開こうとしたら削除されて、しかも削除済みのフォルダにもない。
どうしたら良いんだこれ。
メール消えてもうた。
550デフォルトの名無しさん (アウアウカー Sa15-Ar/h)
垢版 |
2020/07/23(木) 11:58:48.40ID:qQzwkkHta
>>549
スレチ
551デフォルトの名無しさん (ワッチョイ 4901-It4W)
垢版 |
2020/07/23(木) 11:59:14.78ID:5yzO6ql90
ロードに1分以上かかるのに、一見、ロードされているように見せかけるのも、問題があるように感じる。
人によっては、本文の無いメールが来たと思う人もいるだろう。

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

さすがにこれは仕様というよりバグなんじゃないのかな?
556デフォルトの名無しさん (ブーイモ MMcb-4Yr4)
垢版 |
2020/07/23(木) 12:31:43.83ID:iL/DIdMFM
officeTANAKAのおじいちゃんの動画見てる人いる?
2020/07/23(木) 13:19:56.66ID:OedHhoi20
>>555
死ね
2020/07/23(木) 17:49:45.58ID:XAOqwh8/0
>>556
WEBを流し見した方が早い
同じ内容なら動画は時間がもったいない
2020/07/23(木) 18:24:47.13ID:otdPxTIka
おじいちゃんよりperfect human NAKATAなら見るけど
560デフォルトの名無しさん (ブーイモ MM4d-4Yr4)
垢版 |
2020/07/23(木) 19:47:21.57ID:9f0mDEOaM
中田のは世界史/日本史やってるときはよかったが
範囲を広げすぎて見てるほうも興味ないしやってるほうも専門じゃないからおもしろくない
561デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/23(木) 19:47:32.61ID:XyxsyJax0
このスレは雑談スレで質問はVBAでもビジネスsoft板スレで聞いた方がいいのかな
2020/07/23(木) 20:23:47.73ID:46il5rmY0
課で全員が共有する色んなExcelのファイルがあるけど
xls→たいがいマクロ組んでないからそのままマクロ組むこともある
xlsm→作成者の作ったのを見て少しだけ弄ることはある
xlsx→手を出さない
2020/07/23(木) 20:32:21.34ID:jBwCrw170
subってプライベートにしないと何か良くないことあるんですか?
2020/07/23(木) 20:39:15.52ID:FOonXAhZM
>>561
雑談してるスレ住人達の興味を引くような質問なら答えてくれるかもな
あるいは答えることで承認要求が満たされそうな質問とかマウント取れそうな質問とか
2020/07/23(木) 20:40:34.07ID:aUHqAsWY0
>>563
目障りだ。消えろ!
2020/07/23(木) 20:52:02.29ID:i+261XKMd
>>563
プロシージャを沢山作るだろ。
その中にゃちょっとお試しのSub test1()なんてのが作られる。
で、同名のプロシージャとか作ると、色々問題が出る。
プライベートならモジュールが変われば問題無し。

そもそも、面倒くさいからわりと忘れがちだが、ちゃんとスコープや型を考えて作れない人のプログラムは出来も悪いことが多い。
バグも作りがちだね。
2020/07/23(木) 20:53:38.12ID:LqjC2Hh/0
ちゃんとクラス作んないとな
2020/07/23(木) 21:08:16.92ID:togpUAVc0
クラスとかよー分からん
オブジェクト指向の言語やるといいのかな?
2020/07/23(木) 21:14:07.35ID:vlSabEZu0
作らなくても何とかなってきたんだろ、だったら要らないよ。
どうせクラスとかインテリセンスに項目追加するぐらいの効果しかないでしょ。
2020/07/23(木) 22:12:35.10ID:Ybp1dMGc0
>>562
無能自慢はやめとけ
2020/07/23(木) 22:29:15.13ID:lFUaLbQa0
名前はクラスだけどやってることはほぼ構造体だしな
2020/07/23(木) 22:41:45.26ID:bXbPEMrj0
イベントを持った動的に生成するフォームはクラスでやるしかないのでは
と、思うのだが(´・ω・`)違ったらごめんね
クラスなんか要らない構造体で十分って言ってる奴、知的好奇心足りなさすぎでは
2020/07/23(木) 23:49:06.55ID:i+261XKMd
>>572
VBEにメニュー追加して、メニュー押した時のイベントにはクラスが必要だね。

VBAはクラス使わなくても組める言語だけど、時々クラスがピッタリ来る場合がある。
そういう場合はクラス使った方がメンテナンス性とか後々良いことがある。
2020/07/23(木) 23:54:31.71ID:w5Kgum7s0
ADOとかUIAutomationとか、長くなりそうなのは面倒だからクラス。
2020/07/24(金) 07:38:12.69ID:kDVWriuI0
クラスの意味はわかるけど使うメリットがようわからんな
for eachで回せるくらいしか思い浮かばないんだが…
javaチックに全部クラスで作るのもなんか違う気がするし
2020/07/24(金) 08:16:46.34ID:4h264/iA0
またVBAでクラスの話かよ…
せめてClass_Initializeに引数持てたらな…
2020/07/24(金) 08:56:19.08ID:qHYHRNzt0
>>576
'Class_Initialize' イベントはサポートされなくなりました
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/misc/bc42001

オブジェクト指向プログラミング (Visual Basic)
コンストラクター
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/concepts/object-oriented-programming#constructors
2020/07/24(金) 09:00:02.69ID:ASBY7bf4M
それVBAではなくて本家のVBの話だろ
2020/07/24(金) 10:09:40.26ID:4h264/iA0
>>577
ここまで頭悪い奴も珍しいなw
https://i.imgur.com/xv7gdOM.jpg
2020/07/24(金) 13:38:33.26ID:w9fToQCu0
わざわざ画像にしなくてもURLに書いてるし
2020/07/24(金) 13:53:31.22ID:JpqyONWeM
VBAもVBも黒歴史になりつつある点では似たり寄ったりだけどね
Office ScriptsではTypeScriptが使われるようになるんだっけ?
2020/07/24(金) 15:25:00.32ID:9v9Epd9J0
CodeLabとOffice Scriptsの違いが分からん
2020/07/25(土) 00:45:14.24ID:JvyY8SZI0
クラスのメソッドで例外が起きた時、メソッド内の発生場所で止まるようにする方法はありませんか?
標準モジュール内のメソッドを呼んだ位置まで巻き戻って停止してしまい、デバッグしづらいです。
2020/07/25(土) 03:30:34.71ID:XNRsY3fo0
止まったら何もできない
2020/07/25(土) 03:47:33.86ID:vIjhxGJs0
>>583
デバッガでステップインすれば
https://docs.python.org/ja/3/library/pdb.html
2020/07/25(土) 03:48:10.37ID:vIjhxGJs0
ごめんpythonのスレと間違えた
587デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/25(土) 03:52:26.30ID:ajAv/KNZ0
こことPythonのスレはどうしようもない馬鹿が来るよな
2020/07/25(土) 10:50:18.42ID:JW+blTJS0
>>584
説明不足だったかもしれません。

標準モジュール内で例外が投げられると、発生した行の色が変わって停止します。
これをクラスのメソッド定義の中でもできるようにしたいんです。
2020/07/25(土) 11:09:06.42ID:lCi24Eq2a
オプション→全般のエラートラップをクラスモジュールで中断にするとよい。
2020/07/25(土) 11:33:18.16ID:JW+blTJS0
>>589
ありがとうございます
2020/07/25(土) 11:36:14.62ID:JW+blTJS0
シェルスクリプトのことをシェルってゆうなってあるけど、どう違うの?
2020/07/25(土) 11:36:22.19ID:JW+blTJS0
誤爆
593デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/26(日) 00:01:52.46ID:YUJGnmE80
シェルで使うスクリプト
2020/07/26(日) 00:13:48.38ID:PahVuP8ha
Excelで使うVBAに関する質問スレッド
595デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/26(日) 00:58:59.92ID:5SabrGL+0
馬鹿は勝手な略語を使う法則
2020/07/26(日) 01:28:13.97ID:PahVuP8ha
「Excel」とはマイクロソフト社が販売する代表的なコンピューター上で動作する表計算アプリケーションソフトウェアのひとつです。

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

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

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

「part」とは・・
2020/07/26(日) 01:30:01.34ID:uKzXRGWLM
>>596
「質問」とは質問だろ
2020/07/26(日) 01:38:30.83ID:PahVuP8ha
【パート】【パーツ】
部分、全体の一部、断片
小説の節、戯曲・詩などの部,編,巻,(連載物の)回や
楽器演奏者の役割、時間労働者、機械の部品
などがあります。
2020/07/26(日) 01:52:49.28ID:sW/RrXzf0
死得るスクリプトを見たら最後
600デフォルトの名無しさん (ワッチョイ 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
2020/07/26(日) 11:27:03.08ID:DWe9vbm70
>>600
b = Val("&H" & Cells(1, 1).Text)
602デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/26(日) 11:28:35.60ID:5SabrGL+0
また馬鹿が戻ってきたか
603600 (ワッチョイ 1301-8Xcr)
垢版 |
2020/07/26(日) 11:31:04.04ID:Jda+4IKu0
>>601
おお、ありがとうございます。 出来ました!
2020/07/26(日) 11:33:49.79ID:b0sneaTl0
なんで変数の型も理解してない輩がExcelでバイナリ扱ってるの?
605デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/26(日) 11:36:23.90ID:5SabrGL+0
>>604
midiでスレを検索しろ
全部丸投げで作って貰おうとしてる厚かましい馬鹿だ
2020/07/26(日) 11:48:03.95ID:xaHx8eK10
VBAごときでイキるなって
2020/07/26(日) 16:21:34.57ID:81ge+c7W0
馬鹿に馬鹿だと言ってるだけでVBAでイキっているわけではない
VBAスレに馬鹿が多いからそう見えるだけで
2020/07/26(日) 16:41:47.78ID:MK3muVKT0
馬鹿に馬鹿と言ってなんの意味あんのよ
2020/07/26(日) 17:52:03.33ID:sW/RrXzf0
意味なんか関係ない
610デフォルトの名無しさん (ワッチョイ 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

についておしえてください。
611デフォルトの名無しさん (ワッチョイ 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
2020/07/26(日) 19:53:49.36ID:sW/RrXzf0
日本語わかってないのかな
2020/07/26(日) 20:06:40.41ID:aLsM3Hzz0
30分かかって気付いたミスはコードの貼り間違いだけかよw
質問なんなんだよw
614デフォルトの名無しさん (スッップ Sd33-VaRO)
垢版 |
2020/07/26(日) 20:22:52.99ID:OH794sXtd
馬鹿ばっか
615デフォルトの名無しさん (アウアウエー Sae3-Ar/h)
垢版 |
2020/07/26(日) 20:33:02.31ID:T8T+tUZ4a
>>610
質問の仕方を教えるにはどうしたらいいでしょう?
https://note.com/saiyo_shokunin/n/n3c34e30e00df
616デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/26(日) 20:53:16.35ID:YUJGnmE80
>>611
他にも続きがたくさんあるでしょ
全部のせないとわからない
2020/07/26(日) 20:57:58.22ID:b0sneaTl0
そもそも質問が無い
618610・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ブロック変数がしていされていません。

と出てまたダメでした。

どうすりゃいいですかね?
619デフォルトの名無しさん (ワッチョイ 8b8e-VaRO)
垢版 |
2020/07/26(日) 21:43:35.53ID:F4Iawv3Z0
>>618
内容理解してないだろ
馬鹿かよ
2020/07/26(日) 22:01:17.25ID:NJflbSmf0
マルチポストが駄目と分かった上でもやるのは性質が悪すぎる
2020/07/26(日) 23:11:04.71ID:sW/RrXzf0
東京湾に連れて行くのがめんどくさい
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
つまり
623デフォルトの名無しさん (アウアウエー Sae3-Ar/h)
垢版 |
2020/07/27(月) 04:00:49.04ID:AjWs5F06a
スレチ
2020/07/27(月) 16:42:54.98ID:toMb+PQtr
セルをダブルクリックしたらセルの内容を削除(delete)キーを押した状態にしたいんだけど可能かな?
2020/07/27(月) 17:43:54.17ID:uXQw94U/0
可能だよ
WorkSheetのBeforeDoubleClickイベントを使う
Deleteメソッドではないことに注意
それとは別に、普通にメソッドを実行するとUndoできなくなって危険だから、Sendkeysとか使った方がいいかも
2020/07/27(月) 18:43:19.75ID:xLC4DZCW0
久しぶりにこのスレ来たけど
お前らが相変わらずで安心したわ
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
2020/07/27(月) 19:35:23.16ID:qan76PHt0
>>627
文字数が多いのかもしれないと思ったなら少なくして試せばその考えが正しいのかどうか質問するまでもなく判明すると思うよ
2020/07/27(月) 20:41:26.42ID:FDPJJmZc0
>>627
そのファイルがないと確認できない
2020/07/27(月) 20:53:58.84ID:MCUd8BVw0
typeって使うとなんかいいことある?
少しずつパラメータは違うけど処理が同じのを何回もやらなきゃならなくて
Rengeでベタうちの方が後で見てもわかりやすいんだけど
そうすると少しずつ違う処理を全部作らないといけないんだよなあ
かと言って変数で共通化するとわかりにくくて後でメンテが大変そうでさあ
継承とかあればいいのに
2020/07/27(月) 22:43:35.72ID:FDPJJmZc0
コメント書いときゃいいんじゃね
2020/07/27(月) 23:06:24.84ID:FGdyWgnW0
VBAマクロの質問になりますが、
Webブラウザ上で検索した結果、10件ごとに1ページずつ結果がされた後に、
マクロから2ページ目に遷移する為の"2"のボタンを押したいのですが、
ソースコードの表示でhtml上に2のnameやtypeが表示されない為、マクロから2ページ目以降を自動的にクリックできません。
どなたかお教え願います
633デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/28(火) 00:05:21.07ID:S0kilWhd0
ボタンを検索してそれが"2"やったら押したらええんやで
2020/07/28(火) 00:11:20.83ID:blBd/uyT0
VBAのマクロ上でどう検索すればいいでしょうか
635デフォルトの名無しさん (ワッチョイ fb8c-keh3)
垢版 |
2020/07/28(火) 00:22:36.19ID:S0kilWhd0
vba dom ボタン でググった最初のサイトに書いてるやないか
2020/07/28(火) 00:22:46.29ID:572xGNLz0
html上でまったく見分けがつかないなら無理だ
あきらめろ
637デフォルトの名無しさん (アウアウエー Sae3-Ar/h)
垢版 |
2020/07/28(火) 00:25:17.81ID:p8KDyqHYa
絶対に押すな!ってコメント書いとけばいいんじゃない?
2020/07/28(火) 00:26:19.28ID:blBd/uyT0
Web上からname属性やタグ等の情報が拾えない場合の画面上のボタンをクリックする方法が知りたいです
639デフォルトの名無しさん (ワッチョイ d1e6-l24t)
垢版 |
2020/07/28(火) 00:31:40.60ID:572xGNLz0
違うよ、クリックされたときのイベントハンドラを知るべきだよ
2020/07/28(火) 00:32:32.93ID:blBd/uyT0
VBAからchromeを起動して、googleでセルから拾ったwordの"りんご"を検索結果で表示させ、
htmlのソースコードが見れない状態で、2ページ目に遷移するボタンをクリックする方法になります
641デフォルトの名無しさん (ワッチョイ d1e6-l24t)
垢版 |
2020/07/28(火) 00:39:14.92ID:572xGNLz0
見ろよ
2020/07/28(火) 00:44:13.26ID:blBd/uyT0
>>641
vba domで検索したらそれらしきページがありました
ありがとうございます
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

通勤中にスマホで書いたから試してないが、こんな感じでいけない?
2020/07/28(火) 08:08:15.26ID:cRv8WCzbd
>>640
ChromeでやるならSelenium系の話になるだろう。
IE系ならInternetExplorer.Application使ってできる。

属性については、Id、name、classnameあたりが無いならgetElementsByTagname使ってタグの何番目とか、そのオブジェクトの親、さらにその親あたりをId、name、classnameあたりで取得して、childnodesの何番目とやる。
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
2020/07/28(火) 16:44:46.31ID:1uHtckRe0
>>645
サブルーチンとして呼び出しをしたいと思っています
2020/07/28(火) 17:11:42.28ID:LXXezy4S0
そりゃ標準モジュールではイベントは発生しないからな
処理そのものは標準モジュールにサブルーチン(つか言い方が古いw)として定義してもいいけど
イベントそのものはイベントが起こるところで拾って呼び出せ
2020/07/28(火) 17:54:35.95ID:1uHtckRe0
>>647
単純にワークシートの方に
Sub test ()
Call Worksheet_Change()
End Sub
こういう呼び出しをしてあげればいいということでしょうか
2020/07/28(火) 17:57:02.06ID:zYqweXz10
じゃあtestはどうやって呼び出すの
2020/07/28(火) 19:05:20.92ID:HNUdUhp40
気合
2020/07/28(火) 19:15:09.19ID:jZfcEvn60
根性
2020/07/28(火) 19:49:41.64ID:LXXezy4S0
まずイベント(イベントハンドラ)とは何かを学んで
2020/07/28(火) 20:25:12.41ID:NP/CLywd0
ワークシートのイベントの中で標準モジュールのプロシージャを呼び出す
もしワークシートモジュールに一切コード書きたくないならクラス使うしかない
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
2020/07/28(火) 23:44:22.96ID:q9B0Ijiva
>>648
ワークシートの中を変更したらチェンジのイベントが起きるよね?
2020/07/29(水) 00:33:18.42ID:rQllrZ0M0
>>654
strDateはただの文字列の変数だから置換した結果をセルに入れ直さなきゃセルの中身は書き換わらんよ
2020/07/29(水) 00:46:40.06ID:d6pTrFks0
>>656
あーなるほど。最後のところ
End If
r.Value = strData
Next
にしたらできました、ありがとうございます
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文を使用してインクリメントするのではなく、表示させたいページとそれに対応する添え字で処理をしてくしか方法はないのでしょうか
2020/07/29(水) 02:34:23.24ID:TpnjQV/H0
それでページ遷移したらバグを疑うが
2020/07/29(水) 13:22:46.34ID:mS6Tz06p0
本社が作って社内システムにアップロードされてるVBAマクロが
マクロの記録をつなぎ合わせて作った酷いコードでつらい・・・
連続した1000行*5列ぐらいのコピペするだけなのにVBE50行ぐらい使っててつらい・・・
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
2020/07/29(水) 14:31:44.31ID:MurrSo1vd
>>658
クリックする命令が無いが、For文の中でクリックしているとして、

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

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

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

ぐらいは気になるね。
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)
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
2020/07/29(水) 16:02:10.87ID:AAZ7Zxr30
>>663
Dimの型を省略するとVariantになる
全部Longにしたい時はこう書く
Dim EndRow As Long, cnt As Long, cnt2 As Long
2020/07/29(水) 16:11:12.11ID:AAZ7Zxr30
>>663
ReDim ary3(EndRow) がおかしい
最小限直すなら ReDim ary3(1)
2020/07/29(水) 17:54:47.23ID:OLLqLA300
>>663
変数の中身がどういう動きしてるか1行1行確認しよう
2020/07/29(水) 18:28:53.19ID:6iCm/sfN0
>>665
勉強になりました。ありがとうございます

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

>>667
確認しましたが、すべてのcntの時にary3が空になってしまっていました
2020/07/29(水) 18:36:47.82ID:XMqoLN/00
>>664
ひょっとしてary2には値が入っていたけど
ary2(cnt) = Cells(cnt,1)
で、セル値を設定してて
セル値に値が入ってないとかいうオチだったりして
2020/07/29(水) 19:15:26.15ID:pwxjYZ3c0
Mapに固定値設定してMapから取り出すってなんか意味ある?
直接固定値見てもいいんだけど
671デフォルトの名無しさん (ラクッペペ MMee-LxoB)
垢版 |
2020/07/29(水) 19:38:04.93ID:/vJCggp/M
書いたやつに聞けよ
2020/07/29(水) 20:52:19.99ID:OLLqLA300
>>668
どうして空になってるのか順に追って行かないと原因わからんでしょ・・・
673デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 09:11:02.16ID:G1iLlMLAH
VBAの知識0なんですけど
・1000円以上買うごとに1口
・1ヶ月感の累計購入金額総額で抽選
この条件で最大300人に当たるキャンペーンやりたいんだけど
これをVBAで動かして抽出するのにどれくらいの手間がかかりますか?

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

ランダム関数でなんとか無理やり組もうとするとデータ多すぎてメモリたんなくなる・・・
2020/07/30(木) 09:15:44.99ID:sgyBPyzj0
>>673
できる業者に委託する金だけだせばいいんじゃね
2020/07/30(木) 09:20:25.92ID:oxoY3p6DM
そんなもんDBに投入してSQLで一発だろ
676デフォルトの名無しさん (ラクッペペ MMee-LxoB)
垢版 |
2020/07/30(木) 09:23:42.54ID:JMS2FJh9M
一口ごとに1枚プリントアウト。この時なるべく小さい紙に印刷するのがポイント!
後は紙を穴の空いたボックスに詰めて目隠しした担当者が300枚を抜き出す
2020/07/30(木) 09:36:09.05ID:tHevDqCo0
個人の氏名ごとに口数記録するじゃんね
口数の合計値をlongにいれるじゃんね
longの最大は21億〜だからいけるじゃんね
んでその合計値が例えば20万だったら
20万の中からRandomをうまいこと使って300個の数字を抽出すればいいだけじゃんね
各数字は氏名ごとに記録した口数を上から合計したときの数値と一致するわけじゃんね
簡単じゃんね
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になったり、重複したりしたら無効でやり直しするじゃんね
2020/07/30(木) 09:44:36.17ID:tHevDqCo0
てかどういう風でもいいからゴリゴリやっていくのが面白いのにさー
スマートじゃなくてもいいからゴリゴリいこうぜぇー
680デフォルトの名無しさん (ドコグロ MM9a-Fc3l)
垢版 |
2020/07/30(木) 09:48:09.38ID:P52O6TU4M
おまえら食いつきがいいな
681デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 09:51:09.03ID:G1iLlMLAH
最初口数だして横に5000まで数字並べて
IF(1〜5000<口数,RAND(),"")って全部のセルに埋めてたら
20000×5000の関数が動くからフリーズして困ったんだよね・・・

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

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

VBAじゃなくてもいいのか・・・ありがとう
2020/07/30(木) 09:56:06.13ID:tHevDqCo0
それなんも工夫ないじゃんね
つまらないじゃんね
のーたりんじゃんね
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つずつ誰のものか確認して当選者とする
2020/07/30(木) 10:35:23.48ID:cH8Va6i20
じゃんね、ってどこの方言だろ
東京ではじゃんとは言うけど
じゃんねはあまり使わない
使ったとしてもここまで執拗に使わないじゃんね
686デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 11:11:00.39ID:G1iLlMLAH
この方式だと重複当選しちゃうな・・・
2〜3回繰り返して重複当選除外してやるかいね
どうせ1回しかやらんし
2020/07/30(木) 11:50:07.24ID:RHK/Swp/0
ああ、重複当選なしなのね
じゃあ300じゃなくて400ぐらいやっといて、301以降は順に重複時用の補欠にすればいい
2020/07/30(木) 11:50:49.23ID:A5neBprE0
2口の人は2回当選して然るべきでは?
口数ってそういうモノだと思うが
689デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 11:58:26.01ID:G1iLlMLAH
複数当選してしまうと総額が景品表示法に引っかかってしまうんですよ・・・
690デフォルトの名無しさん (ワッチョイ ce8c-UdrD)
垢版 |
2020/07/30(木) 12:09:03.16ID:LgbrNaJ+0
>>673
A列に個人名(もしくは個人コード)
B列に1回の購入金額

この形式で基礎データをもらえるものだと思っていいの?
691デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 12:11:02.85ID:G1iLlMLAH
>>690
ユーザーIDと期間内の累計購入金額は貰えます
手元に前年同月のデータもあります
2020/07/30(木) 12:18:53.15ID:AlO/S9Es0
>>689
その場合、複数応募者は口数に比例して当選確率を上げるアルゴリズムにしないと公平にならないけど
正直にやるか、手を抜いて全員の確率を同じにするかは運営側の気持ち次第
2020/07/30(木) 12:58:00.60ID:sgyBPyzj0
知識0でやろうとするのが間違いだと思うが
2020/07/30(木) 13:01:49.26ID:5b+GEPmC0
>>673
何の手間?
695デフォルトの名無しさん (JP 0H62-5jfS)
垢版 |
2020/07/30(木) 13:20:10.92ID:G1iLlMLAH
VBAの基礎を学んで言われたことを遂行するための知識を得るための手間かな・・・ほんと知識0なんで必要ならこれを機に手を出してみようかなと
2020/07/30(木) 13:41:23.22ID:/qyU4NXl0
なんか前もこんな奴居なかった?
2020/07/30(木) 13:59:59.21ID:tHevDqCo0
ビール飲みながらすげー適当に組んでみたんだけどあげちゃだめなの?
てかコード貼ったら使えるレベルなん?
うちの3世代ぐらい前のi5のPCで300件で5分ぐらいかかりそうな感じだけど
2020/07/30(木) 14:12:07.28ID:cH8Va6i20
>>697
いや、仕事しようよ
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

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

タグ以外にラベルやタイプ等で特定要素を抽出する方法はありませんでしょうか
2020/07/30(木) 14:23:09.16ID:tHevDqCo0
>>698
でしゅよねー(ろれつが回らない
2020/07/30(木) 14:30:10.36ID:5b+GEPmC0
>>695
書き方だけならネットでいくらでも調べられる
言語知識よりやりたいことを実現するため計算方法を考える力が一番重要
2020/07/30(木) 15:27:13.51ID:YhpZ6thja
>>673
知識ゼロならまず、実現する為の手順を箇条書きで書き出す。
それを皆んなに見てもらっていけそうになったら
その手順に従ってプログラミングする。
2020/07/30(木) 15:33:07.63ID:zHAo07P50
Excel VBAの問題じゃなくてそれ以前の問題だよな
704デフォルトの名無しさん (スッップ Sd9a-nhZs)
垢版 |
2020/07/30(木) 15:36:31.06ID:keIwCUAVd
perl,pythonスレに続く釣りなのかね?
2020/07/30(木) 15:36:51.50ID:THFUAhsVr
innertextでクラス配下のaタグの行を1つずつ抽出でfor eachでページ番号のラベルに引っ掛けて処理するっていうのは可能でしょうか
2020/07/30(木) 17:31:34.81ID:THFUAhsVr
すいませんある程度自己解決しましたが、取得した要素にouterhtmlで抽出したところ番号順にタグ情報が取得出来たのですが、outerhtmlに続けて.clickだとエラーになります
一旦変数に格納しないとクリック出来ませんでしょうか
2020/07/30(木) 19:05:02.57ID:GYhlOBUpd
>>706
まずさ、OuterHtmlの型は何か考えてみようよ。
これでピンと来ないようなら、色々勉強する必要がある。
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タグ要素を一行ずつ取り出してボタンクリックしたいのですが、
この構文で可能でしょうか
2020/07/30(木) 23:22:34.48ID:b3ddbfY40
ちゃんもリファレンスを読んで返り値の型を確認しようね
710デフォルトの名無しさん (ワッチョイ d68e-nhZs)
垢版 |
2020/07/31(金) 00:01:53.71ID:sBpjKr+V0
>>708
そろそろ死ねよ
2020/07/31(金) 06:14:13.92ID:mPBeAG88a
>>708
まず自分で考えるくせを付けたほうがいいよ
712デフォルトの名無しさん (ワッチョイ 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
713デフォルトの名無しさん (アウアウエー Sa22-DfbS)
垢版 |
2020/07/31(金) 08:36:27.75ID:BJAFpQuia
>>712
は?ちょと、なに言ってのかわからない
何もおかしくないじゃない!?
ちゃんと54て出てんじゃん!
2020/07/31(金) 09:39:24.31ID:j4Q2HRqw0
局所最適なんだから初期値によって結果が異なるのは自明です
2020/07/31(金) 11:33:16.53ID:QyaenPE80
で、それのどこにVBAが関係してるんだ?
2020/07/31(金) 12:13:10.42ID:QmvWOqJdd
>>708
OuterHtmlの型は文字列。
ということは
Dim strA As String
strA="abc"
strA.Click
と同じことしようとしてる。
2020/07/31(金) 12:28:54.85ID:TQ16TWaV0
質問です
シェイプを回転させたくて
シェイプのRotationX,RotationY,RotationZを弄ってみたのですが、
Z軸は上手く行くのですが、X軸、Y軸はその軸に併せて縮小するだけで全く奥行きが出ません。

これは設定するプロパティが足りないのでしょうか?
それともこういうものなんでしょうか?
2020/07/31(金) 13:03:40.39ID:qhJJRQ9da
2.5Dとか擬似 3Dに過ぎないからでしょ
2020/07/31(金) 20:02:27.14ID:Seq7lwgB0
>>713-714
エクセルに問題がないなら問題があるのは私ということで考えてみたら
与えた命令を根本的に勘違いしていたみたいです
同じ値を複数回選択することもできると思っていました
もともと想定していた目的には問題なく使えますし、
もし複数選択させたい場合は同じ値を複数入れて対応します
スレ違いにも関わらず温かくご回答いただきありがとうございました

>>715
スレ違いだったみたいで申し訳ないです
ご迷惑おかけしました
2020/08/01(土) 08:39:00.72ID:kuObS2ra0
>>717
透視投影?
確かにマクロの自動記録でもそこだけ変わらないな。

しかしこれ何に使うんだろうな。
重すぎてポリゴンゲーは作れないしな。
スターフォックスレベルでも無理だろ。
2020/08/01(土) 09:22:34.54ID:wQymbaU60
部屋の模様替え後のレイアウトをExcelで作ろうとしてた人はいたな
2020/08/01(土) 09:31:20.60ID:znOplMqnM
一軒家の建築図面をExcelで作ろうとしてる人もいるかもしれない
2020/08/01(土) 11:11:05.09ID:Y2rZE5zP0
セルの色で絵を描くおじいちゃんがいる
2020/08/01(土) 11:15:30.51ID:qSPnGZZQ0
15年ぐらい前に、セルに色を塗ってゲームやアニメを作るのがはやった
2020/08/01(土) 11:19:29.08ID:biQ1QRTHa
Excelで 3Dモデル表示は出来るぞ?

ホーム
わかできブログ
ExcelやWordでも3Dモデルが扱えるというので試してみた

https://www.wakarutodekiru.com/blog/tips/673.html

https://www.wakarutodekiru.com/blog/wp-content/uploads/2020/05/2017-09-25_15h52_57-600x447-1.png
2020/08/01(土) 11:33:13.92ID:qSPnGZZQ0
できるかできないかじゃなくて、表示パフォーマンスや製作コストが実用レベルかどうかが重要では
727デフォルトの名無しさん (アウアウカー Sa5d-DfbS)
垢版 |
2020/08/01(土) 11:39:41.69ID:biQ1QRTHa
>>717の目的は
【シェイプを回転させたくて 】
なので回転出来るんだからそれで達成できてる
728デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/01(土) 11:47:14.76ID:bRba9mah0
エクセルを禁止しないと日本のITは韓国に追いつけない。

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

Ubuntuを使うべき。
2020/08/01(土) 12:06:15.89ID:51ANSeyq0
EXCELとの因果関係を証明せよ
2020/08/01(土) 12:21:54.41ID:wQymbaU60
そもそも子供はExcel使ってねーだろ
なんか電波でも出してるのか?
731デフォルトの名無しさん (アウアウカー Sa5d-DfbS)
垢版 |
2020/08/01(土) 12:29:20.74ID:biQ1QRTHa
ソロバンから電卓に代わってもそうゆう人って一定数いるよね
小学生からExcel使えるなら
FAXで集計してるコロナ関係者よりマシ
2020/08/01(土) 12:35:20.61ID:GdrGS70y0
そうゆうとか言ってる人はVBAの前に日本語勉強したほうがいいよ
733デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/01(土) 12:49:17.09ID:bRba9mah0
小学生のIT教育でUbuntuのインストールを教えるべきでは?
734デフォルトの名無しさん (アウアウカー Sa5d-DfbS)
垢版 |
2020/08/01(土) 12:59:14.62ID:biQ1QRTHa
すいませんすみませんあーざーっす
「なんで、そーゆーこと言うの?」さおいふ
オッハーマヨチュチュ
タイガーアッパっパー
「こちらの方でよろしかったですか?」
「おにぎり温めなかったほうで大丈夫ですか?」
「お買い物袋はお持ちでありませんでかまいませんか?」
735デフォルトの名無しさん (ワッチョイ 2590-roBb)
垢版 |
2020/08/01(土) 13:03:30.83ID:cAfu1ZYc0
https://research.sc/participant/login/dynamic/B5FBEF0B-B393-431A-A00A-88ECA7469238
736デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/01(土) 13:04:03.06ID:bRba9mah0
UbuntuはスパコンのOSにも使われているので、数学に強いです。

エクセルは禁止にするべきです。
2020/08/01(土) 13:50:27.99ID:VVRkNkWF0
>>736
金持ちLinuxおじさんこっちに来てまで迷惑掛けるなよ
2020/08/01(土) 17:35:39.71ID:l0aqZI9e0
マクロ実行ボタン1を押すとマクロ実行ボタン1が消えて
新しいマクロ実行ボタン2が出現。ボタン2を押すとマクロ実行ボタン3が出現するような
繰り返し動作を行いたいのですが可能でしょうか?
コードを教えていただきたく、よろしくお願いします。
2020/08/01(土) 17:45:47.31ID:BG2/nyCb0
>>738
つVisible
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
2020/08/01(土) 18:58:42.53ID:B3d0/RPj0
一つのボタンにいろんな機能を詰め込むのはどうかと思うの
2020/08/01(土) 19:43:27.83ID:0WCKoTHWM
>>738
最近そう言うUI多いけど昔のように押せない時はグレーアウト(.Enabled)する方がわかりやすいと思うのは俺だけ?
2020/08/01(土) 20:04:46.26ID:xQeMvl7Qa
もう少し背景が分かるとね

インストーラの [次へ] みたいならこうだとか、有意義な回答が得られそうだけど
2020/08/01(土) 20:14:10.47ID:Y2rZE5zP0
ボタン1が押される
表示をボタン2に変える
無効にする
ボタン1の処理する
処理終わる
有効にする

これならまぁ押された時の表示によって分岐もありかな
2020/08/02(日) 00:24:11.20ID:fhoRH5wU0
>>743
その場合はシートの移動のほうがスッキリする
2020/08/02(日) 04:27:47.15ID:yz3gxwYFM
ラウンドワンとかゲームセンターに置いてある
「動体視力ゲーム」みたいなのじゃないの?
数字ボタンがランダムな位置に出現して
押したら次のボタンが別の位置に現れるヤツ
747デフォルトの名無しさん (ワッチョイ 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なら大口がいないと重複しなさそう。
重複があったらシートコピーして当選行を削除。
2020/08/02(日) 13:42:27.44ID:7JTul7vs0
俺らそういうのいやだから
重複しなさそうとか認めないし
749デフォルトの名無しさん (ワッチョイ 4e06-LqCg)
垢版 |
2020/08/02(日) 14:04:53.69ID:i29UoGb/0
ベースモデル考えて確率的に速い手段を選ぶだけ。
コード書くのが好きなら計算結果を配列に入れて、既定カウントに達するまで回せばいいけど、時間の無駄。
2020/08/02(日) 14:52:01.85ID:6ZNrYs7D0
条件にもよるけど今回の話の場合は1回目重複覚悟でやってから重複分だけ再度重複なしの方法でやるのが速そうだね
2020/08/02(日) 15:17:38.22ID:7JTul7vs0
時間かかるってそんなの5分で終わるし
2020/08/02(日) 18:40:53.06ID:i29UoGb/0
>>751
ワッチョイって何かわかる?
2020/08/02(日) 19:11:50.62ID:7JTul7vs0
>>752
実際にコード書いたから5分かかるっていってんだろぼけなす
てめぇみたいに他人のワッチョイに執着する気持ちの悪いはげおやじじゃねぇんだよぉ
2020/08/02(日) 22:26:59.52ID:RZU5Rxbr0
>>747
A列:連番
B列:口数
C列:当選確率 = 口数/口数の合計
D列:点数 = 当選確率*RAND()
これでソートかけたほうが簡単じゃね
300番付近のボーダーラインで点数の重複が生じたら
重複者のみを対象に再度抽選
まだ重複者がいたらさらに再度抽選(・・・)

再抽選回数が0〜300と未定だけども現実的には多くても数回で終わるだろうよ
755デフォルトの名無しさん (ワッチョイ 4e06-LqCg)
垢版 |
2020/08/02(日) 22:40:10.04ID:i29UoGb/0
>>754
そちらの方がいいですね。
2020/08/03(月) 02:34:06.94ID:R5x2YJ6L0
それだと当選確率が公平にならない気がする
まあコーディングの手間と計算時間と公平さとどっちを取るかだな
2020/08/03(月) 05:36:57.74ID:Z9mi6E360
一回の抽選ごとに当選者を省いていけばいとおもうが
2020/08/03(月) 06:39:58.48ID:R5x2YJ6L0
数学的に「当選者を除外しながら次を抽選」で公平になる

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

300人の抽選なんて1秒もかからないし、プログラムもきわめて単純、作業列も必要ない
2020/08/03(月) 11:15:41.27ID:n1hXaiTs0
>>756
当選の公平さを取らないと企業として問題あるよ
760デフォルトの名無しさん (テテンテンテン MMee-DfbS)
垢版 |
2020/08/03(月) 11:17:37.07ID:uwp3oPMnM
5ちゃんに書き込んでる時点でお察し
2020/08/03(月) 11:20:43.87ID:n1hXaiTs0
もう無理して数式でなんとかしようとするよりVBAでさっさと作った方がややこしくないし手っ取り早いんじゃないの
それなら処理時間なんか気にする必要も無し
2020/08/03(月) 12:19:51.87ID:nPrsNj3oa
や〜い、お察しお察し〜
2020/08/03(月) 12:31:15.20ID:rYhmIRt7a
いぜん懸賞の雑誌で架空の人物に当選したとかやってたな
764デフォルトの名無しさん (ラクッペペ MMee-LxoB)
垢版 |
2020/08/03(月) 12:34:55.84ID:Dbk7eCCQM
発表は発送をもってかえさせろってのは
みんなインチキだよ

運ちゃんがボスジャン着ていたのは役得
2020/08/03(月) 12:41:50.97ID:1eg4GQBHa
抽選システムなんて大概再使用されるだろうから手作業で当選者除去とかやらないといけないならVBAで組んじゃったほうがいいだろうな
2020/08/03(月) 13:54:58.27ID:QvK0nIgr0
つかVBAの乱数とか公平といえるんかね
本当に公平な抽選は第三者立ち合いで見えるようにやるんだが
2020/08/03(月) 14:42:43.98ID:n1hXaiTs0
プログラムによる抽選が不正扱いなら全国の企業が謝罪案件になるが・・・
2020/08/03(月) 14:57:06.86ID:wycAObPT0
第三者立ち合いで乱数生成を!?
2020/08/03(月) 15:12:09.39ID:7WhWwh2+a
パチンコ屋はあやしい
2020/08/03(月) 15:30:38.22ID:2tn2jJCj0
立会人を選定するための立会人が必要になるな
2020/08/03(月) 18:38:47.21ID:Z9mi6E360
立会人って居るだけじゃねーの
772デフォルトの名無しさん (ワッチョイ d68e-nhZs)
垢版 |
2020/08/03(月) 18:41:49.78ID:cM5/PGxb0
座って接待を受けるだけの誰にでも出来る仕事
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

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

それが出来てそのあとどうする気か知らんが
CMBbox2.Clear
CMBbox2.AddItem (Sheet1.Cells(CMBbox1.ListIndex + 3, "L").Value)
これで、二度と来るな
778デフォルトの名無しさん (ワッチョイ d68e-nhZs)
垢版 |
2020/08/03(月) 21:53:06.72ID:cM5/PGxb0
また馬鹿が出てきた
2020/08/03(月) 23:28:33.53ID:lnWa4YOga
>>776
簡単なのはループで入れる。

r=最終行 + 1 to 最終行 + 150
cells ( r, 1)= date
next r
2020/08/03(月) 23:29:45.08ID:lnWa4YOga
for とか、変数宣言とか抜けてるけど、そこはがんばって補完して。
781デフォルトの名無しさん (ドコグロ 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
2020/08/03(月) 23:44:27.96ID:lnWa4YOga
なるほど、それはそうだ。
失礼しました。
783デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/04(火) 00:12:45.83ID:brj+kH5Y0
>>780
ありがとうございます!
あとは自力で頑張ってみます!
784デフォルトの名無しさん (ワッチョイ 5d01-UdrD)
垢版 |
2020/08/04(火) 00:17:38.16ID:brj+kH5Y0
>>781
解答ありがとうございます!
1つの答えに対し複数のコードがあるって面白いですね!
初歩的なコードが書けるよう頑張ってみます。
2020/08/04(火) 00:51:16.26ID:EtqCKuKj0
そういう感想が出るってことは、答えを出すための手順を全く自分で考えたことがないのでは…
786デフォルトの名無しさん (ワッチョイ d68e-nhZs)
垢版 |
2020/08/04(火) 01:06:00.92ID:8QweQuKX0
>>784
死ねよ
2020/08/04(火) 02:59:27.48ID:o+2T/J1u0
RNDやRAND関数は疑似乱数だから公平じゃない
そもそもコンピューターで乱数を生成するのは不可能

知識としては知ってるけど、代替手段を考えるのも面倒だしみんなRNDを使ってるから別にいいんだよ、ってこと
2020/08/04(火) 05:51:29.11ID:HcyQwD6H0
そのための乱数シードってのがある
789デフォルトの名無しさん (ワッチョイ 794e-wQ/k)
垢版 |
2020/08/04(火) 06:07:40.64ID:vydsY05j0
同じシード与えたら同じ乱数列吐くよね。
で?何のためにあるって?
2020/08/04(火) 06:08:47.59ID:k3XyFiOUM
もう最大限のことも自分で考えない馬鹿には答えなくて良くね?
多分何度も聞きに来るぞ
2020/08/04(火) 06:09:01.26ID:k3XyFiOUM
最低限ねw
2020/08/04(火) 06:22:53.51ID:HcyQwD6H0
>>789
同じシードを与えないためだろ、使い方知らんのか?
2020/08/04(火) 07:55:02.77ID:aUyBUHRY0
>>787
コンピュータという広域の括りであれば
乱数を発生させるのは不可能ではないよ
2020/08/04(火) 09:23:33.17ID:Lx6h4ngm0
数式で「真の乱数」を発生させることは不可能でしょ
何かしらの雑音を外部から取り入れるならあり得るけど

しかし真の乱数と区別できない疑似乱数というのはある
たかだか数万個の乱数を発生させる程度なら普通にRANDで構わんよ
コンピューター空間内(例えば64bit)なら32bitの疑似乱数を発生させ得る
2020/08/04(火) 09:36:35.85ID:PJZofGaLa
excel起動時のシードが同じだから変えたほうがいいとおもう
2020/08/04(火) 12:47:00.19ID:aUyBUHRY0
>>794
数式で真の乱数を発生させることが出来ないのは多分そう。ただ、それでも真の乱数は発生出来る。

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

ただそれは、一度世界で最も出回ったハードであり言語でもあって、それでは乱数を求めるのに至極当たり前の方法でもあったから
このスレにいるおじいちゃんにはひょっとして知ってる人もいるかも知れない。
2020/08/04(火) 12:54:38.56ID:2b7giDdtM
乱数こそこのスレで教えてくれた最高の武器
15個〜20個しか評価してないデータを50個に乱数使ってn増ししてるわ
プロシージャ名は乱れ雪月花にしといた
798デフォルトの名無しさん (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
2020/08/04(火) 20:23:21.05ID:/v2mWUPK0
2016使ってるけど、いつの間にかSORTBYとかFILTERとか使えるようになってるのな。
2020/08/04(火) 20:58:22.81ID:ExHQkzho0
そもそも乱数に偏りがあろうと応募者が狙った並びでない時点で機会は公平だけどな
2020/08/04(火) 21:08:04.57ID:HcyQwD6H0
決まった番号がでるとわかっているからその番号に身内を入れて置けるわな
2020/08/05(水) 07:02:57.17ID:JB7qoIQVa
>>797
偏差値低くね?
2020/08/06(木) 11:58:31.88ID:ix60cQMV0
乱数で疑似データをつくるとばらつきが均等になるから偏差を求めたときに不自然に広がるよね
2020/08/06(木) 13:28:48.79ID:LOZz8PJN0
乱数2つ使うといいぞ
2020/08/07(金) 19:45:16.94ID:Gk+vywdrM
スレチだったらスマソだけど、excelのスピル?のせいで、ver違うexcel間で共有してたファイルが勝手に配列やら@やら数式が変換されてバグってんだけど、これ無効にできないの?
806デフォルトの名無しさん (アメ MM75-cUya)
垢版 |
2020/08/07(金) 20:09:47.44ID:l761nrW2M
>>805
キミにピッタリな格言を贈ろう。
It is no use crying over spilt milk
2020/08/07(金) 20:45:55.98ID:Ojdjt83K0
できないの?
2020/08/07(金) 20:47:34.25ID:SPZQdxGT0
>>807
最近追加されたアレね
分からん。田中先生にでも聞いたら?
2020/08/07(金) 21:11:23.51ID:Gk+vywdrM
え・・・まじで無理なん?
おわってんな
2020/08/07(金) 21:38:31.44ID:CC9P+z2z0
最近の機能の不具合だから知らねってことやろ
2020/08/07(金) 22:08:09.38ID:TxGR6Whm0
旧バージョンの配列式に勝手に@が付くのは仕様じゃねえの
旧verの {=a1:a3} が新verでは =@a1:a3 に変換される
新verのスピル式 =a1:a3 は旧verでは {=a1:a3} に

VBA的にはFormulaプロパティとFormula2プロパティを使い分けることによって新旧verどっちにするかを指定できる
2020/08/08(土) 13:26:33.40ID:LUeSHsN4H
パーフェクトExcelVBAの初版本の正誤表とサンプルコードってどこかにありませんか?
2020/08/08(土) 14:27:44.52ID:KW6vxjpw0
出版社に聞いたら
2020/08/08(土) 15:27:34.88ID:QEOcQPDQ0
>>813
たし蟹
2020/08/09(日) 10:06:54.07ID:IyDcd9Ex0
コレクションにaddしたシートだけを一発で選択するにはどうしたら良いですか?
2020/08/09(日) 10:50:04.26ID:Krh2xN+N0
>>815
addしたあとから調べる方法はないからaddする時に変数に覚えておくしかない
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でかまいませんので教えてください。
2020/08/09(日) 13:55:27.58ID:Krh2xN+N0
>>817
自作の関数の中で、ワークシート関数とまったく同じ結果が欲しいなら、Application.WorkSheetfunctionを使うのが一番確実

参考サイトに基本的な作り方は書いてあるから、計算式の部分だけ自分で作り直せばいい
https://kokodane.com/tec3_3.htm
2020/08/09(日) 21:56:13.30ID:KZ1iPV5I0
ITに疎いクライアントのために
デモ用のVBAが動作しているところ録画して見せたいのですが
そのために向いているツールとかありますか?
2020/08/09(日) 22:02:16.81ID:CWT5uO5H0
まずは標準のステップ記録ツールでダメな点を書けよ
821デフォルトの名無しさん (ワッチョイ 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

文章が意味不明なんだけどこんな感じでいいの?
2020/08/10(月) 01:01:45.89ID:rZUUjilg0
>>819
Excelの画面をビデオ録画する操作はExcelを起動してから田+Alt+R
ただしVBEのウィンドウは開いても重ねても録画されないので、ワークシート上にマクロの起動ボタンを置いておく必要がある
2020/08/10(月) 06:44:41.63ID:2p1s3ccJ0
>>819
win10なら標準で画面録画ツールあるよ
win+rだったかな
2020/08/10(月) 08:03:08.52ID:RlCz4Cin0
822で解決してる内容を間違って紹介するの巻
2020/08/10(月) 08:12:31.43ID:3XgF7vK3M
>>820の時点で普通は調べりゃわかる
2020/08/10(月) 08:49:14.88ID:BA9+NJPC0
>>815
そういう時はDictionaryにすれば良いんでね?
2020/08/10(月) 08:51:12.59ID:BA9+NJPC0
>>819
そのVBAを自動実行するVBAを書く。
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
ひたすら続く

これを短くするにはどうすれば良いでしょうか?
2020/08/11(火) 02:42:12.83ID:biGjq8v+0
A1:A1000
2020/08/11(火) 03:03:48.27ID:w/eGi/vSa
あーっとすみません
AはBと連結していますのでそれぞれが横に連結しています
831デフォルトの名無しさん (ワッチョイ eb8e-bBGy)
垢版 |
2020/08/11(火) 03:10:45.62ID:iwyIkneF0
>>830
死ね
2020/08/11(火) 03:24:29.64ID:gr6gl0bw0
>>828
まずセルの結合が無駄の元だから禁止するのが一番の早道
2020/08/11(火) 03:32:11.78ID:w/eGi/vSa
>>832
やはりそうですよねぇ
既存のフォーマットに寄せようと思うとどうしても結合セルが必要に...
色々試行してみます。
2020/08/11(火) 07:15:12.76ID:MYNVwvse0
悪いけどこの程度のこと質問するようじゃ手でやったほうが早いと思う
該当セルを全部選択して右クリックから値のクリア
2020/08/11(火) 07:29:46.25ID:QzKTaZ840
>>834
それをマクロの記録で記録するのが一番楽だわな
2020/08/11(火) 09:13:15.51ID:MYNVwvse0
>>835
この程度なら、毎回やるにしてもマクロ使わずに手でやって余裕でできるレベルだろ
2020/08/11(火) 09:43:23.03ID:Y2BcIsaJ0
できるかできないかじゃないのがわからない奴
2020/08/11(火) 10:26:55.02ID:XBdR516ja
>>828
きったないコードの書き方になるが
Din i as Long
For i =1 to 最後の数
Range(”A” & i).以下略
Next i
で簡素化
2020/08/11(火) 12:32:13.53ID:Tr96IgUh0
range("a1:最後").value=emptyじゃだめなのか
2020/08/11(火) 12:34:29.17ID:LWJewwPf0
>>828
Dim i    As Long
Dim lngMaxRow As Long

'/// 最終行取得
lngMaxRow = ActiveSheet.Range("A65000").End(xlUp).Row

'/// ループ処理
For i = 1 To lngMaxRow
ActiveSheet.Range("A" & i).MergeArea.ClearContents
Next i
2020/08/11(火) 14:42:39.58ID:GML8Ehqkd
.Clear と .ClearContents と .Value=Empty の違いがわからん
これをマウスやキーボードで再現する方法も
たとえばセルを選択してDeleteキーはどれに相当?
2020/08/11(火) 15:03:15.53ID:3p+RdAeo0
Clearはセルに入力されてる数式や値、そして設定されてる書式もすべて消す
.ClearContents は数式と値のみクリア、書式は残る
.Value=Emptyはニュアンスが逆で"何も無いを入力"、つまり消す。.ClearContentsと同じ

deleteキーは.ClearContentsや.Value=Emptyと同じ
2020/08/11(火) 15:15:55.64ID:KT452e/aM
不規則な結合セルがあると .MergeArea.ClearContentsはエラーになるけど .Value = Emptyなら動くから>>828はRange("A:A").Value = Emptyの一行で解決ってこと
2020/08/11(火) 15:48:36.99ID:QMl7gTyj0
foreachやればええやん
2020/08/12(水) 02:04:20.40ID:ArSORnRx0
>>834-844 ありがとうございます!
皆さんが言うように全くの知識ゼロですが色々検索してなんとか思った通りのボタンが完成しました。
しかし全角やらスペースやら分かり辛いプログラムって難しいですね...
2020/08/12(水) 20:55:54.61ID:qkNQ+uZ00
赤線先生が手取り足取り教えてくれるのに何が不満だと申すのかこのガキは
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行目…
というように貼り付けるにはどこを変更したらいいでしょうか

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

それと、stepよりmodで条件分岐スキップさせる方がスマートじゃないかい
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
2020/08/13(木) 00:14:44.45ID:6VU/YWxoa
>>849
その書き方だとRowが大きいやつ排除されずに新しいシートに貼り付けられません?
それともC35までで出力は終わりだからいいんですかね?
メンテナンスしづらいかと思います
2020/08/13(木) 00:25:56.44ID:87HjPNaJ0
>>850
そういう時はセル範囲を変数にして、どっちかのインデックスを3で割るか掛けるかすればいいんだよ
それならメンテは一箇所で済む
データの範囲をxlUpとかUsedRangeなどで調べたりテーブル化すれば全自動にもできる
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行、みたいに
してみました
2020/08/13(木) 01:59:57.87ID:KWfn8cHZ0
>>852
tmpArrにセル内容入れた時のインデックスを確認すればわかる
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環境って現状こんなものなの?
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
というように変化していきましたので大丈夫そうです、ありがとうございました
2020/08/13(木) 11:34:45.35ID:25tyhxYJ0
コンパイルエラーじゃねーか、何を問題にしているのかわからん
2020/08/13(木) 12:50:45.70ID:2SQEG+lQ0
試してないから知らんけど
64ビット長の文字列とかサポートされてないから当然だと思うけどな

つか今のEXCELついに64ビットが規定になったのか
2020/08/13(木) 13:00:55.28ID:KWfn8cHZ0
>>855
いや、なんでインデックス0だとエラーになるかって話・・・
2020/08/13(木) 14:08:49.69ID:cxZ8EfEa0
>>858
あ、そっちでしたか
エラーが出た状態のそれぞれのインデックスは
rowIndex 1
colIndex 1
arrIndex 0
でしたので、
tmpArr(arrIndex, colIndex) = tmp
のところが
tmpArr(0, 1) = tmp
になってエラー、ですかね?
2020/08/13(木) 14:16:56.76ID:KWfn8cHZ0
>>859
tmpArrにインデックス0は存在しないのに指定するからエラーが出ていて、セル範囲を代入した時は1から始まることを知らなくても変数の状態をチェックすればすぐわかることだが、もしかしてローカルウィンドウとかを知らないパターン
2020/08/13(木) 14:35:55.00ID:cxZ8EfEa0
>>860
あんまり使いこなせてはいないですがローカルウィンドウは表示させています
849さんが教えてくれたコードの中でarrIndexを「0」に指定しているのにはなにか
理由があるんじゃないかと思ったんですが、書き間違いとかでしょうか?
2020/08/13(木) 14:49:25.52ID:KWfn8cHZ0
>>861
意図は知らない
2020/08/13(木) 18:33:06.86ID:25tyhxYJ0
>>861
そういうのスルーできないとこの先進まんよ
2020/08/14(金) 07:43:46.87ID:whfJUs+50
VLOOKUPについての質問なんですが、

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


りんごから別セルの検索範囲1を見た後に検索範囲2を見にいって産地の戻り値を得る関数を作りたいのですが、
検索キーのヒットで産地が重複した場合は表示を1度だけにして、期待する結果として「岡山県 山梨県」とだけ得られるような関数を作りたいです
VLOOKUPを&で繋げると「岡山県岡山県」と列の一番初めの戻り値しか得られません
VLOOKUP以外でもやり方があれば教えて頂ければ助かります
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
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
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
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
2020/08/14(金) 12:40:48.74ID:DbBU1lOD0
>>868
おお!流石です。
2020/08/16(日) 00:23:38.07ID:oP+sOQXV0
>>864
構造体使えば簡単に作れそうだけどね。
2020/08/16(日) 13:39:49.06ID:6OTbxtgn0
質問しないで自力でできるようになるのがまず先だろう
2020/08/19(水) 20:44:10.60ID:1ghAy1sC0
スレ全否定で草
2020/08/20(木) 01:09:34.68ID:Qa4rAQro0
シート1のプルダウンから選択した結果(テキスト)を
シート2の任意のセルに表示させるにはどうすればいいですか?
2020/08/20(木) 07:05:04.54ID:UH//ZFwI0
リンクするセルに指定しておけば
2020/08/24(月) 18:59:52.50ID:ga12x2Hwd
A列には数字を手入力
B列には●があったりなかったり

B列に●がある場合A列に数字を(例えば100)入力するとメッセージボックス?がでて
「●があるから入力しちゃ駄目よ!どうしても"100"を入力したいの!?」
「OK」「キャンセル」
みたいにしたいんですがどーすればいいですか?
2020/08/24(月) 19:07:40.74ID:k+YcXwpu0
Worksheet_Changeイベントを使えばいいです
2020/08/24(月) 19:26:54.83ID:w4ZB1tmF0
>>875
データの入力規則のエラーメッセージ
2020/08/24(月) 20:16:24.02ID:pfMfCN200
1を入力した時点でメッセージボックスが出ると思うんだが10まではセーフで100だと確認のほうが良いのか
2020/08/24(月) 20:27:42.41ID:N/ceNi6Ud
>>875だけどいい忘れてました
0を入力した場合はメッセージ出さずにそのまま0と入力
0以上(例えば200)を入力した場合は「●なんだから入力すんなボケ!どうしても"200"って入力したいの?」
「OK」「キャンセル」
みたいなね
2020/08/24(月) 20:34:28.35ID:ZbbapVPTd
OK押したらそのまま200がセルに入力される
キャンセル押したら""ね
881デフォルトの名無しさん (ワッチョイ 9f8e-NwtD)
垢版 |
2020/08/24(月) 20:35:32.06ID:C0VIZWNb0
馬鹿は条件を後で付け加える
2020/08/24(月) 20:36:54.05ID:ZbbapVPTd
>>881
誹謗中傷?
883デフォルトの名無しさん (ラクッペペ MM4f-NoNb)
垢版 |
2020/08/24(月) 20:42:38.20ID:hwq7Y5YHM
メッセージボックスはうっとおしいからセルの色を変えるぐらいのほうが喜ばれるよ
2020/08/24(月) 20:46:47.07ID:ZbbapVPTd
>>883
それでも入力する奴がいるんだもん
IF(B2:B10000=●,"入力すんな","")
これでも駄目
2020/08/24(月) 20:56:49.89ID:w4ZB1tmF0
数字以外を入力したら?
2020/08/24(月) 20:59:38.82ID:KH3D74B7d
>>885
数字以外入力しません
2020/08/24(月) 21:02:06.67ID:w4ZB1tmF0
自主的にしないのなら入力規則をユーザ設定にしてエラースタイルを注意でいいじゃんかと思うんだが
2020/08/24(月) 21:19:01.81ID:hykwk2E+d
>>887
そうか
やってみようかな
ちなみにVBAだとどう書くの?
2020/08/24(月) 21:58:37.53ID:w4ZB1tmF0
●があるあったらダイアログ表示するだけ
2020/08/24(月) 21:58:57.09ID:w4ZB1tmF0
●があったら
891デフォルトの名無しさん (ドコグロ MM7f-a78p)
垢版 |
2020/08/24(月) 22:34:30.60ID:6Nxhc9klM
個性的な物を作りたいのなら図形を使えば色も形も自由自在に作れる
2020/08/25(火) 07:27:56.68ID:Dix5Myuw0
Win10で、VBAを作っています。
テキストファイルをLine関数で1行ずつ読み込み
読んだ行にてInStr関数で円マーク(\)を検索
しています。
InStr(1, 検索対象, "\")
と書いています。
しかし\が無い行で「ある」と判定されているようです。
\にはエスケープ文字が必要だからではないかと思いますが
どう書いたら良いかわからず途方に暮れています。
どなたかご教示ください。
(文字コードで指定すれば良いようですが
他の担当者が理解できない可能性もあるので
別の方法も把握したく存じます)
2020/08/25(火) 09:38:34.28ID:UEyqjSRY0
無いのにあると判定される行の文字列を教えて下さい
2020/08/25(火) 09:40:05.96ID:j61R6fge0
instr特に問題なさそうですが。
ウォッチ式の想定外時検索対象文字列は晒せないのですか?
instr使わずに1文字ずつ取るとか?
2020/08/25(火) 10:33:08.00ID:JyPo3Qi40
>>892
されてるようですじゃなくてちゃんと確認して
2020/08/25(火) 10:41:04.86ID:8u+D4XfyM
>>893
海砂利水魚の水行末\n
2020/08/25(火) 11:01:09.56ID:UEyqjSRY0
>>896
次の人どうぞ
2020/08/25(火) 11:14:02.60ID:HdlOc3e6M
>>893
[壁]_・)_シン・シンギュラリティ¥n
899デフォルトの名無しさん (ラクッペペ MM4f-pqEW)
垢版 |
2020/08/25(火) 12:47:56.13ID:LoAGT2GVM
>>893
会社の住所です
一文字目が全角郵便マーク
2文字目が全角スペース
三文字目から半角数字で郵便番号です。
\と半角ハイフンの間を取り出す処理を
書いたところ
郵便番号最初の3桁、
ハイフンの手前まで
が取り出されますので
全角スペースが\マークとして
扱われてると思ってます
2020/08/25(火) 12:58:49.60ID:KRGfI1UYM
>>893
「\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
\と半角ハイフンの間を取り出す処理
を全角スペースが\マークとして扱われてると思ってます
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-」
2020/08/25(火) 13:03:59.81ID:at7FUvm30
>>899
そもそもVBAにエスケープ文字とかないから
お前のコードがバグってるか、テキストがちゃんと読めてないかどっちかだろ

とりあえずコードと読み込んだデータ晒せ
2020/08/25(火) 13:39:05.50ID:UEyqjSRY0
>>899
その説明だとコード晒してもらわないとわからん
住所そのまま晒してって言ってるんじゃなくて
別の文字に置き換えていいから同じフォーマットで
処理前後でどうなってほしい所がどうなってしまうのか書いてもらわないとわからない
2020/08/25(火) 13:53:58.00ID:JyPo3Qi40
>>900
なんで想像するだけで実際の中身を確認ようとしないの
2020/08/25(火) 13:54:35.07ID:JyPo3Qi40
>>903>>899
2020/08/25(火) 14:14:41.86ID:NinLgEivH
プログラムってのはなあ、思った通りには動かないもんなんだよ
いつでも書いた通りに動くだけ
2020/08/25(火) 14:23:43.06ID:QWQtRQIZ0
タブとか改行(CR+LF)とかバイナリデータが混ざっているとか機種依存文字とか
文字コードの違いとか色々あるからな
2020/08/25(火) 14:28:30.69ID:at7FUvm30
まあ一番怪しいのは、文字コード関係でテキストがちゃんと読めてない
ちゃんと読みこんだデータのバイナリ確認してみろ
2020/08/25(火) 14:43:48.86ID:JyPo3Qi40
line inputはSJISで読み込む
バイナリ確認しなくても元ファイルがSJISであればそれでいい
909デフォルトの名無しさん (ラクッペペ MM4f-pqEW)
垢版 |
2020/08/25(火) 15:50:41.61ID:LoAGT2GVM
すみません892です
デバッガで見たら
全部の行で1を返してました
つまり全行、先頭は\マークみたいです
1文字目は無視するようにしたら
意図通りの動きになりました
2020/08/25(火) 16:00:19.40ID:UEyqjSRY0
>>909
それ完全にその場しのぎでしかないから
他の担当者が後々困る絶対
2020/08/25(火) 16:23:37.10ID:JyPo3Qi40
先頭が\かどうかすらも確認しないのか…
912デフォルトの名無しさん (オッペケ Sr73-rg60)
垢版 |
2020/08/25(火) 17:36:53.32ID:Lm28KJF/r
VBAからPowerShellで外部コマンドを実行して出力内容を加工したいのですが、うまくいきません
現在は、Execの引数に下記のように書いてます
powershell -Command "& Invoke-Expression 'コマンドのパス\コマンド.exe' -option1 -option2 "foo bar" >>'一時ファイル.txt'"

どうしたらよいでしょうか
2020/08/25(火) 18:00:08.63ID:YUvg5uyAa
>>909
1件目でも入っているのかな?
2020/08/25(火) 18:12:08.06ID:mPnhNdWta
テキスト全行読み込みしてsplitしてる説
んで\rでsplitして\nが先頭に来てるんじゃね
2020/08/25(火) 20:46:10.83ID:+ct4ya2Y0
>>912
Exec("powershell -Command Invoke-Expression 'コマンドのパス\コマンド.exe' -option1 -option2 'foo bar' >> '一時ファイル.txt'")
916デフォルトの名無しさん (ラクッペペ MM4f-NoNb)
垢版 |
2020/08/25(火) 20:53:13.85ID:4vNIHvGrM
shell でいいのにわざわざ外部オブジェクト使う人っているよね
917デフォルトの名無しさん (アウアウウー Sa63-/2iM)
垢版 |
2020/08/25(火) 21:28:28.78ID:n9RIifSya
>>914
改行コードは別に文字列としての\が入ってる訳じゃないだろ
918デフォルトの名無しさん (オッペケ Sr73-rg60)
垢版 |
2020/08/25(火) 22:12:02.97ID:Lm28KJF/r
>>915
ありがとうございます
もう一点よろしいでしょうか
標準出力にUnicodeで吐き出すコンソールアプリの出力を、Wscript.Shell.ExecのStdOutを使用して読み込みたいのですが、文字化けします
個人情報を扱うのでできれば一時ファイルを作らずに作業したいのですが、Unicodeの標準出力を直接読み込む方法は無いでしょうか
2020/08/25(火) 22:59:12.42ID:8Q4E/UJjM
>>899
>>903なるほど特殊文字が16進数表記で¥マークってことか>>909
〒 〒 \03012 郵便マーク
920デフォルトの名無しさん (ワッチョイ 118e-WkEz)
垢版 |
2020/08/26(水) 01:37:45.74ID:zCSTsYdn0
>>918
スレチだろ、厚かましい
2020/08/26(水) 02:00:19.04ID:BpaQECb00
>>918
オプションなどで、文字コードを指定できないの?
922デフォルトの名無しさん (ワッチョイ 7901-yRqa)
垢版 |
2020/08/26(水) 02:56:47.46ID:oEB3gdtA0
これから新規に作る形式の文字コードは、UTF-8とGB18030の二択じゃないでしょうかね。
923デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 11:13:08.29ID:DBm/bRJ+r
>>921
調べたところわかりませんでした
Unicodeの文字が欠落するのでSJISに変換して流すのも避けたいです
一晩考えてPowerShell側でBase64エンコードしてからVBA側でデコードしてみようと考え直しました
失礼しました
924デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 11:25:02.41ID:DBm/bRJ+r
ちなみに、Wscript.Shell.Execに渡せるコマンドラインって255文字までのような制限があるのでしょうか
コンソール側で動いたコマンドラインがExecからだと動かなかったりするので
2020/08/26(水) 19:01:16.17ID:vVfdbk8D0
>>924
状況がわからないので超エスパー回答すると、
32bitじゃないと動かないものを64bitで実行しようとしている。
2020/08/26(水) 19:03:04.71ID:vVfdbk8D0
powershellか。
ごめん、関係ないわ。
927デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 19:09:15.11ID:DBm/bRJ+r
>>926
ありがとうございます。
PowerShell上で動作を確認したワンライナースクリプトをExecで実行したら動かなかったもので、特に根拠があって疑ってる訳じゃないです。
こちらはPS1ファイルを用意して実行することにしました。
928デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/26(水) 19:15:01.39ID:DBm/bRJ+r
ところで、ADODB.Streamに書き込んだテキストをCSVとしてパースしてRecordSetに読み込む方法をどなたかご存知ないでしょうか
一時ファイルを保存すればいいのですがオンメモリでやれたらそちらの方がありがたいです
同じADODBクラスなので方法がありそうだなと思い調べてみたのですが…
929デフォルトの名無しさん (ワッチョイ 118e-WkEz)
垢版 |
2020/08/26(水) 20:35:45.89ID:zCSTsYdn0
>>928
厚かましいスレチはいい加減にしろ
2020/08/26(水) 20:40:23.56ID:SKzt3LIS0
ノイズが発生してるけど無視していいよ
知ってて答えたい人が答えると思うし
2020/08/26(水) 22:47:53.03ID:vVfdbk8D0
>>928
ちょっと意味が分からない。
そこまで知っていて出来ないというのは、どこで躓いているのか。
2020/08/26(水) 22:50:24.69ID:Xm7NIhRp0
できないわけじゃない
1文字づつ解析とか馬鹿らしくてやってられないから一発でできる方法を聞いておる
2020/08/26(水) 22:52:29.85ID:FaIObZsK0
一年他部署に応援行ってて戻ってきたが
その間に転属されてた人に

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

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

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

Wscript.Exec.StdOutを使用したところUTF8が文字化けしてしまい、PowerShell上でByte配列化→Base64エンコードして吐き出すことで、VBAでCSVのStringを得るところまではできました。
2020/08/27(木) 10:58:22.12ID:W5jLLhyA0
>>934
shiftjisで表示してんじゃないの
937デフォルトの名無しさん (オッペケ 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のリファレンスに目を通していて、関係の有りそうなプロパティを見て回っているのですが、方法をご存知の方いらっしゃればご教示いただけるとありがたいです。
2020/08/27(木) 11:29:45.37ID:h0aAGvNz0
>>934
試験のバイナリと
よくわからない文字のバイナリ比較してみたら
2020/08/27(木) 11:35:18.54ID:UMnMnU6h0
WSH は、CP932 だけじゃないの?
もうWSHは、Microsoft もサポートしていないのでは?

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

漏れは、Ruby スクリプトをダブルクリックで起動したい場合に、WSHを使っているけど、
その際、Ruby側で、CP932・UTF-8 を変換している。
または、NKF というモジュールもある
2020/08/27(木) 11:58:06.46ID:tH7sxKPhM
>>934
そりゃそうだろ…
Unicode文字列をShift-JISだと思ってUnicodeに変換して、それを更にUnicodeだと思ってShift-JISに変換して何をしたいんだ?
やりたいのは
StrConv(StrConv("試験", vbFromUnicode), vbUnicode)
かな?
2020/08/27(木) 12:21:37.52ID:M3gK7ks0M
AddDllDirectory関数の引数にパスを渡したい
この関数の引数はUnicode文字列をである必要があるから、StrConvでUnicode変換してから渡す
変換がうまく行く文字だけのパスなら、AddDllDirectory関数は成功するが、変換がうまくいかない文字が含まれるパスだと失敗する
2020/08/27(木) 12:24:57.51ID:W5jLLhyA0
>>941
vbUnicodeのstrconvだけじゃいかんの
2020/08/27(木) 12:31:49.04ID:M3gK7ks0M
>>942
それが失敗するから、vbFromUnicodeでもう戻したら案の定変になってた
2020/08/27(木) 12:49:42.68ID:h0aAGvNz0
変換がうまくいく文字列
変換がうまくいかない文字列
それぞれ教えてよ

似たような流れ多い?
2020/08/27(木) 13:18:08.14ID:XBcyB/ra0
なぜうまくいかないというコードを出さないのか

とりあえずEXCEL関係ないしVBA何でもスレ行けや
2020/08/27(木) 13:21:23.95ID:M3gK7ks0M
・成功
 日本、解析、実
 あ~む、ア~ミ、濁音、半濁音

・失敗
 試験、行、め~ん、ム~ン、ゃゅょ、ャュョ
2020/08/27(木) 13:28:24.20ID:W5jLLhyA0
strconvが失敗するって時点で、何かの勘違いがあるとしか思えない
2020/08/27(木) 14:18:18.49ID:h0aAGvNz0
あぁ空目してた>>940でいいやん
引数が間違ってる
てか試そうよ
2020/08/27(木) 17:02:04.95ID:DiWyHVVAM
AddDllDirectory(StrConv(パス,vbUnicode))ってコールしたときに
パスに特定文字が含まれると失敗、含まれないと成功

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

ちなみに第2引数をvbFromUnicodeにすると、どんな文字列でもAddDllDirectoryは失敗する
StrConvを噛ませずに、パスを渡した場合も必ず失敗する
2020/08/27(木) 18:30:06.72ID:XBcyB/ra0
AddDllDirectoryの引数をポインタでとって文字列のポインタ渡せば動く気がする
2020/08/27(木) 19:32:16.28ID:nk+dwtaU0
>>935
やっぱわからん。
「UTF8で標準出力に個人情報含むCSV」って、既にその時点でCSVなんじゃないの?
CSVなのにカンマ区切りじゃなくてCSVとして扱えないとか?(何じゃそりゃ)
UTF8が問題ならschema.ini作って回避できない?
schema.ini使う時点で一時ファイルだわって言われたらそれまでだけど。
2020/08/27(木) 21:54:27.65ID:M2V0MDYQM
>>949
とりあえずAddDllDirectoryのDeclare定義と呼び出してる部分のコード晒してよ
Unicode文字列の渡し方って1つじゃないから定義がわからないとなんとも言えん
953デフォルトの名無しさん (オッペケ Sr51-cLD7)
垢版 |
2020/08/28(金) 03:17:22.48ID:0Wmy1rK2r
>>951
CSVファイルではなく、CSVの文字列になります
これをファイルに保存することなくパースしたかったのですが、方法が見つかりませんでした。
セル内カンマやセル内改行も含むCSVでしたので、自分でパースするのもちょっと大変でした。
MITライセンスのコードを見つけたのでそれを組み込んで処理しようと思います。
ありがとうございました。
2020/08/28(金) 09:32:14.87ID:WbcjPKym0
>>949
明らかにおかしいのはStrConv以外だから
元々使い方間違ってただけで変換に問題はない
最少構成でやってみたらわかるはず
2020/08/28(金) 10:58:16.31ID:CzRmvnjE0
Ruby なら標準で、CSV モジュールが付いている。
他にも、JSON, YAML などもパースできる

プログラミングするなら、ちゃんとしたプログラミング言語を使わないと、ダメ!
汎用的な機能を、自作して使うと、バグってばかりで仕事にならない
2020/08/28(金) 12:55:46.61ID:dgSTJFNK0
そもそもここ最強のcsvパーサEXCELのVBAすれなんだが
2020/08/28(金) 13:14:57.90ID:RBhGMmXKM
確かにExcelは世界一利用者の多いCSVパーサかも
958デフォルトの名無しさん (ワッチョイ 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
2020/08/28(金) 23:42:18.02ID:6tfEVBvr0
>>958
ヘルプでformatの書式見た?
2020/08/28(金) 23:47:50.15ID:X3zZxqmk0
newfilename = Format(DateSerial(Year(Now), Month(Now) - 1, 1), "yymm")
2020/08/29(土) 00:17:46.05ID:58gyTBSb0
来年でIEなくなるんか?
IE制御で作ったVBAファイルはどうなってしまうん

https://news.livedoor.com/article/detail/18778408/
962デフォルトの名無しさん (ワッチョイ 6e63-VQ5f)
垢版 |
2020/08/29(土) 00:20:59.98ID:M2c3GV/+0
>>959
ヘルプといいますが色々なサイトを見ましたが私の頭では理解できず・・
やむを得ずお伺いしました
>>960
この式で出来ました!本当にありがとうございます!
2020/08/29(土) 00:54:05.51ID:OUCG9mQHM
00014500-1
のような、数字以外が入ってる文字列から
前ゼロを取りたいです。
どうすれば良いでしょうか
ゼロは先頭以外にもあるので
replaceで削除するのは無理です。
964デフォルトの名無しさん (ワッチョイ 118e-WkEz)
垢版 |
2020/08/29(土) 01:26:16.94ID:uG4P+RAn0
>>963
自分の意思で呼吸を30分止めてご覧
それができなければVBAを使う資格なし
2020/08/29(土) 01:42:59.60ID:haGEh7ED0
>>963
020-040 は 20-40 にすればいいの?
966デフォルトの名無しさん (ラクッペペ MM66-i8JQ)
垢版 |
2020/08/29(土) 04:49:38.60ID:OUCG9mQHM
>>965
はぃ、それで良いです
言葉足らずですみません
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
2020/08/29(土) 05:37:03.41ID:IjPanbf80
入力データにピリオドが入ることはないのか?
2020/08/29(土) 05:42:52.81ID:IjPanbf80
あ、平気か
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
2020/08/29(土) 06:44:47.53ID:VAMGDei30
区切り文字が-だけならsplitして終わる気もするけど
何が入ってるかわからんなら1文字ずつみるしかないのかな
972デフォルトの名無しさん (ラクッペペ MM66-i8JQ)
垢版 |
2020/08/29(土) 07:17:10.36ID:OUCG9mQHM
区切りはハイフンだけです
すみません
分けて各々数字扱いすれば良かったですね
書いてみます
973デフォルトの名無しさん (ワッチョイ 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して数値変換でおわり
2020/08/29(土) 09:09:11.49ID:dZuEnb/K0
しかし今の子はこの程度も分からないほど論理的思考がないのか、
それともこのスレの住民を試そうとしているのか
2020/08/29(土) 09:45:04.26ID:SoqUgBeq0
使う関数提示するくらいで解決できなきゃ放置でいいんじゃね?
2020/08/29(土) 10:00:53.07ID:pUlaC/XX0
For r = 1 To 12000
処理
PDF出力

という処理をしているのですが、これだとPDFが12000ファイルになって、全て出力した後で結合するのですが
これを12000枚程度をPDF1ファイルで出力する方法をおしえてください
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
2020/08/29(土) 10:19:55.18ID:wR6MYEok0
>>976
元データが何なのか知らんけど、
シート上のデータなら、12000ページを1シートにまとめてから出力。
2020/08/29(土) 10:47:19.93ID:dZuEnb/K0
12000ページのPDF・・・
ほんとに聞きたい事なの?これ
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
2020/08/29(土) 10:48:58.87ID:lHm5nrxO0
ってすでに書かれてたわ… Orz
2020/08/29(土) 10:55:28.99ID:jdj2nRjtM
>>979
何かの文書ならともかく、ExcelのPDF化で1万ページは非現実的だよね
自分の会社で使うだけならDB化するのが普通だし
役所に提出する測定資料とかかな?
983デフォルトの名無しさん (ワッチョイ 21d2-vZRt)
垢版 |
2020/08/29(土) 11:18:02.61ID:ebvcDddx0
ある言語だと
"00-001-02"split("-")map(asNumber)join("-")println
2020/08/29(土) 11:19:35.12ID:0Ji7S1+0a
>>976
for
処理
PDF
Next
にしてるってこと?
ならPDFをNextの後に書けば良いんだけど
2020/08/29(土) 13:57:00.39ID:pUlaC/XX0
>>978
1シートにはまとめられません。

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

>>984
シート上に帳票を作り、その帳票をページごとに書き換えています。試していませんが、1シートだと行数が足りないです。
それと、ページごとに罫線とかの書式を作るのはつらいです。
2020/08/29(土) 14:17:55.39ID:dZuEnb/K0
>>985
12時間かけて作った12000ページのPDFは実用に耐えてるの?
それ、手段の一つが目的になっちゃってない?
2020/08/29(土) 14:32:50.04ID:D+h94FkM0
>>985
よくわからないけど、何とかデータをエクセルの表にして、ワードの差し込み印刷でやる、とかはどう?
2020/08/29(土) 14:38:51.56ID:fy0wFynXa
PDF1ファイルにする理由はあるの?
120ファイルぐらいに分けるでしょ普通
2020/08/29(土) 14:42:09.88ID:1Tm3n33G0
伝票とかだと保存義務とかあったりして、出力しておいておかないとダメな時もある

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

が、EXCELでやるのが間違ってるな
ちゃんとした帳票ツール買って対応する言語使えよ
2020/08/29(土) 16:14:59.78ID:EjHgD7140
PDF化って言われても実コマンド書かなきゃアドバイスのしようもないわな
2020/08/29(土) 19:10:04.48ID:91aO+zvA0
シートにまとめられない理由は?
まとめないとして、12000シート作れるスペックはあるのか?
2020/08/29(土) 22:40:12.57ID:LkUYL8wZ0
>>961
これ、マジで困るわ・・・
2020/08/29(土) 23:53:21.40ID:wkbqrDC+0
サポート終了なんだからいつまでもIE使ってんじゃねえよ
994デフォルトの名無しさん (テテンテンテン MM66-nUCc)
垢版 |
2020/08/30(日) 00:09:48.26ID:HNjVBgM5M
>>985
Accessでやって下さい
995デフォルトの名無しさん (ワッチョイ 6e63-8BP0)
垢版 |
2020/08/30(日) 07:04:48.97ID:ZpZWI99c0
IE制御で作る
てどういう意味です?
996デフォルトの名無しさん (アウアウエー 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
2020/08/30(日) 09:03:16.96ID:YG+IT5u+0
Open "C:\Sample\Data.txt" For Input As #1
Line Input #1, buf
Close #1
2020/08/30(日) 09:03:41.78ID:yRrMkFD60
フォルダーパスの最後に/足してみては?
2020/08/30(日) 09:05:06.49ID:YG+IT5u+0
フォルダとファイルの間に/がないとか
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を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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