0251デフォルトの名無しさん (アウアウエー Sadf-UHnC)2019/10/13(日) 21:38:36.38ID:a37CwINqa みんなどうやってVBAそんなに詳しくなったの? 0252デフォルトの名無しさん (ワッチョイ f77c-h29T)2019/10/13(日) 21:44:04.10ID:exOKfr5u0 必要に迫られて作ってるうちに 0253デフォルトの名無しさん (ワッチョイ 9f59-Sohv)2019/10/13(日) 21:48:31.98ID:TUjSthkJ0 休日まで費やして2000行くらいコード書いてるけどそろそろ嫌になってきた 0254デフォルトの名無しさん (ワッチョイ f768-NJTS)2019/10/13(日) 21:50:43.69ID:z6dVpON+0 そのうち、休日に働いて会社でのんびりするようになるよ あんまり良くないんだけど、プログラムは家じゃないと集中して掛けないんだよな 0255デフォルトの名無しさん (アウアウエー Sadf-UHnC)2019/10/13(日) 21:54:03.90ID:a37CwINqa>>254 あー、すごいよくわかる 0256デフォルトの名無しさん (アークセー Sxcb-FpGY)2019/10/13(日) 22:03:41.31ID:0JmSqCe7x>>248 平均的なVBAerってのがどんな層を指してるかちょっと分からないが、Dictionaryが理解できない人ってそもそも配列やCollectionも理解できないんじゃないの? 0257デフォルトの名無しさん (ワッチョイ b74b-x3kW)2019/10/13(日) 22:05:54.29ID:VDajUcWs0 dictionaryの替わりにシートを使うという発想は無かったな 0258デフォルトの名無しさん (アークセー Sxcb-FpGY)2019/10/13(日) 22:13:33.97ID:0JmSqCe7x シートが可視化された配列だってのはその通りなんだけど誰でもGUIで簡単に編集できてしまう点が逆に弱点でもある 値の読み書きだけでイベントハンドラに制御が渡るからそもそも重いし 0259デフォルトの名無しさん (ワッチョイ f768-NJTS)2019/10/13(日) 22:23:41.04ID:z6dVpON+0>>258 まぁねぇ。その辺は考えながらうまく付き合って行きたい所 0260デフォルトの名無しさん (ワッチョイ 9fa2-8cCB)2019/10/13(日) 22:44:44.65ID:Sc8Blp8e0 連想配列ってどういうとき便利なの? いまいち基本書の記述じゃメリットとか使い道とかがイメージできないんだけど 0261デフォルトの名無しさん (ワッチョイ f77c-h29T)2019/10/13(日) 23:07:03.97ID:exOKfr5u0>>260 配列で数字の添え字じゃなくて好きなワードを使いたい時に あとDictionaryの場合は検索がめちゃくちゃ速いから大量データの検索に 0262デフォルトの名無しさん (アウアウウー Sa5b-8cCB)2019/10/13(日) 23:09:26.19ID:YeAfr+Aea>>241 こういうこと? Sub 検索() Const COL_C As Long = 3 Const COL_F As Long = 6 Const COL_O As Long = 15 Dim nSetRow As Long nSetRow = 5 Dim nRow As Long For nRow = 5 To 17 If Not IsExistValue(Cells(nRow, COL_C).Value) Then Cells(nSetRow, COL_O).Value = Cells(nRow, COL_C).Value nSetRow = nSetRow + 1 End If Next For nRow = 5 To 21 If Not IsExistValue(Cells(nRow, COL_F).Value) Then Cells(nSetRow, COL_O).Value = Cells(nRow, COL_F).Value nSetRow = nSetRow + 1 End If Next End Sub 0263デフォルトの名無しさん (アウアウウー Sa5b-8cCB)2019/10/13(日) 23:09:42.80ID:YeAfr+Aea Function IsExistValue(ByVal pValue As Variant) As Boolean IsExistValue = True Const COL_Y As Long = 25 Dim nRow As Long For nRow = 5 To 25 If Cells(nRow, COL_Y).Value = pValue Then Exit Function End If Next IsExistValue = False End Function 0264デフォルトの名無しさん (ワッチョイ 9fea-+Z1Z)2019/10/13(日) 23:20:25.51ID:rkAEaYhN0>>260 Keywordが重複できないから必ず一意なデータセットができる。 0265デフォルトの名無しさん (ワッチョイ 9fe0-o74w)2019/10/14(月) 00:48:24.78ID:2bLpiP0X0 2シートを連結する際、それぞれの各行をクラスインスタンスに代入&コレクション化してるのですが連結方法に悩んでいます 例 Personクラス(pID, 氏名, 名字プロパティ, 生年月日,...)→Persons.Add Personインスタンス, str(pID) Diaryクラス(dID, pID, 作成日, 本文,...)→Diaries.Add Diaryインスタンス, str(dID) '出力 Dim d as Diary For each d in Diaries if(存在チェック) then xxx = Persons.Item(d.pID).名字 Next d
Sub foo() Open "TESTFILE" For Output As #1 ' Open file for output. Call write_(#1,"content") Close #1 End Sub
Function write_(filenumber, content) Write filenumber, content End Function 0268デフォルトの名無しさん (ワッチョイ 9fda-OHYr)2019/10/14(月) 09:38:41.74ID:LU4QFSeP0>>254 >>255 ホント。 プログラムに対する理解のないバカ上司とか、 コーディングの真っ最中に、平気でコピー取りを要求してきたりするからな。 0269デフォルトの名無しさん (アウアウウー Sa5b-8cCB)2019/10/14(月) 12:22:02.07ID:UlmNQm1da>>267 ファイル番号は1-255の範囲で常に固定値でやるなら引数で渡さずにどこも#1でいいかと思う FreeFileって関数があってこれは番号を任意に付番してくれるので たとえば Dim nNo as Integer nNo = FreeFile Open .... #nNo って書くこともできる このnNoを引数に指定してもいいかもね 0270デフォルトの名無しさん (ワッチョイ bf68-NJTS)2019/10/14(月) 12:27:42.70ID:+oSE7p5I0>>269 行けました!ありがとうございます ナンバー記号「#」の詳細ってMSDNかどこかにありますか?
Sub foo()
Dim nNo As Integer nNo = FreeFile
Open "TESTFILE" For Output As nNo ' Open file for output. Call write_(nNo, "conteaasnt") Close #1
End Sub
Function write_(nNo, content) Write #nNo, content End Function 0271デフォルトの名無しさん (アークセー Sxcb-FpGY)2019/10/14(月) 14:39:32.50ID:aC+4aHxsx>>265 Persons、Diariesをコレクションにしている理由は、「Person、Diaryという2つのカスタムクラスの集合オブジェクト」という意味論以外に、何か実装的な理由はあるのかな?
みたいな感じ 0279デフォルトの名無しさん (ワッチョイ bfad-la4p)2019/10/14(月) 22:48:09.17ID:PwgP8aUB0 VBAで表からその左の行を検索したいのですがどうしたらいいでしょうか? Dim rng As Range Set rng = ws_siriaru.Range("D:L").Find(ken4, LookAt:=xlWhole) If rng Is Nothing Then rng MsgBox ""ない Exit Sub End If siriaru = Range("C" & rng.Row).Value gouki = siriaru label_siri = gouki では表示はされるのですがうまくいきませんでした。 0280デフォルトの名無しさん (ワッチョイ 9fe0-o74w)2019/10/14(月) 23:16:54.59ID:2bLpiP0X0>>278 重ねてありがとうございます。
Sub Main() Dim n As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws1cell As Range Dim r As Long Set ws1 = Worksheets(1) Set ws2 = Worksheets(Worksheets.Count) n = ws1.Cells(Rows.Count, 5).End(xlUp).Row + 5 For r = 1 To ws2.Cells(Rows.Count, 5).End(xlUp).Row Set ws1cell = ws1.Range("E:E").Find(ws2.Cells(r, 5).Value, lookat:=xlWhole)'項目名が違い、達成率が100%でない場合は開始日・終了日・達成率を更新 If ws1cell Is Nothing And ws2.Cells(r, 10) < 1 Then ws1cell.Range(ws1.Cells(n, 8), ws1.Cells(n, 10)).Value = ws2.Range(ws2.Cells(r, 8), ws2.Cells(r, 10)).Value n = n + 1 Else'達成度が進んだ場合は開始日・終了日・達成度を更新 If ws1cell.Value = ws2.Cells(r, 5).Value And ws1cell.Offset(0, 3) < ws2.Cells(r, 8) Then ws1cell.Offset(0, 3) = ws2.Cells(r, 8) ws1cell.Offset(0, 4) = ws2.Cells(r, 9) ws1cell.Offset(0, 5) = ws2.Cells(r, 10) End If End If Next r End Sub 項目名が違う時にエラーが出てしまいます If ws1cell is nothingの部分で変数を解放しているから問題なのかと考えていましたが、ws1cell = "" , 0に書き換えてもウォッチウィンドウで見ると set ws1cellを通った後もnothingのままになっていました setを通れば変数を定義出来ると思っていたのですが、どのようにすれば解決できますか? よろしくお願いします 0350デフォルトの名無しさん (ワッチョイ f345-UkKt)2019/10/18(金) 14:35:51.85ID:C4vTbpVj0 改行エラーが出てしまったため2つに分けました VBAを使い始めて1ヶ月弱なのですがC#でエクセルを操作出来るようになりたいと考えております VBAで作ったプログラムを元にして、C#を学ぶ方法は無いでしょうか? 書き方が全然違うとの話を聞いたので、諦めて最初から覚えるしかないかと途方に暮れております よろしくお願いします