X

Excel VBA 質問スレ Part67

■ このスレッドは過去ログ倉庫に格納されています
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/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
なんか前もこんな奴居なかった?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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