[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA:文字数制限』(いまちゃん)
教えて下さい。
E F 1 A100 2 C100-101 2.01 C104 2.02 C107-108 ・ ・ ・ 上記のようなデータがE/F列にあり、E列のデータを上と下で比較して 同じであれば、F列のデータを引っ付けるとゆー作業がしたいのですが・・・ E F 1 A100 2 C100-101,104,107-108 ・ ・ ・ 文字数制限をかけて、F列のセルに40文字を超えると合成しないようにしたいです。 sa = Range("e65536").End(xlUp).Row For sh = 1 To sa If Cells(sh, 5) = "" Then Exit For Koumoku = Int(Cells(sh, 5)) '上の項目 suuchi = Len(Cells(sh, 6)) '上のロケの文字数 roke = Cells(sh, 6) 'ロケ '下カテゴリの抽出 For i = 2 To suuchi If Val(Right(Left(roke, i), 1)) <> 0 Then Exit For Next Kategori = Left(roke, i - 1) koumoku2 = Int(Cells(sh + 1, 5)) roke2 = Cells(sh + 1, 6) '上カテゴリの抽出 For j = 2 To suuchi2 If Val(Right(Left(roke2, j), 1)) <> 0 Then Exit For Next kategori2 = Left(roke2, j - 1) If Koumoku <> koumoku2 Then GoTo chigau If suuchi + suuchi2 > 40 Then GoTo chigau If Kategori <> kategori2 Then GoTo atari suuchi = Len(Kategori) roke2 = Mid(roke2, suuchi + 1, 40) atari: Cells(sh, 6) = roke + "," + roke2 Range(Cells(sh + 1, 5), Cells(sh + 1, 6)).Delete shift:=xlUp chigau: Next
つたないコードをかいたのですが、合成した下のデータを削除すると、どうしても
40文字に満たないのに次のセルに合計値が返ってしまいます。
どなたか教えてくださいm(_ _)m
>E列のデータを上と下で比較して同じであれば 例題では同じではないようですけど?
行を削除すると、行番号がずれるのが原因だと思います。 行削除をループで使うときは最下行から Step-1 でループします。 今回の場合、逆ループはしづらいので、セルの文字のクリアだけにしておいて、 後からまとめて行削除しては如何でしょうか?
(INA)
E F 1 A100 2 C100-101 2.01 C104 2.02 C107-108 ・ ・ ・ 上記のようなデータですと、下から合成していくと E F 1 A100 2 C100-101 2.01 C104,107-108 ・ ・ ・ となってしまうのです。(上記のは例です) E F 1 A100 2 C100-101,104,107-108 ・ ・ ・ 出来ればこのような形にしたのですが・・・なんとかできないでしょうか?(いまちゃん)
>最初は下から合成していたのですが、それですと一番上が少なくなってしまいます。 ですから、行削除しないで上からループしては如何ですか?
(INA)
あなたが書いているコードのままです。 行削除すると、行番号がずれるので、 行削除しない方法で、プログラムをお作り下さい。
(INA)
E F 1 A100 2 C100-101,104 2.01 ,C107-108 2.02 ・ ・ ・ 上記のようになってしまいます。 E F 1 A100 2 C100-101,104,107-108 2.01 2.02 ・ ・ ・ としたいのですが・・・どこを直せばよいでしょうか。 お願いします。(いまちゃん)
40文字の条件を無くして、1セルにまとめる処理だけ考えてみては如何でしょうか? そのあとに、40文字で分割する処理を作ってみるとか。
眠くて頭が回らないので、ロジックを考える思考力がないです・・・(--;)zzZZZ
何でだれもこないのかなぁ〜・・・Help! W(`Д´)W Help!
(INA)
パッと見で、よくわかんないし♪〜〜( ̄ε ̄; ) レスだけ来ました(^_^A; そのうちManちゃんが来るかな・・・・(-。-) ボソッ この手の課題はお好きなようだし(¬д¬。) |)彡サッ!! (川野鮎太郎)
INAさんが壊れた(汗) というか、 40文字超えたらどうしたいの?とか、 2.01や2.02という数値は消していいの?とか、 データはE列昇順に並んでいるの?とか、 仕様提示不足なので「どこを直せばよいでしょうか。」という問いには答えが付かないでしょう。修正後のコードも乗ってないし。 とりあえず、一番最初に提示されたコードを見ても、 suuchi2に値を代入していないけどいいの?とか、 「カテゴリの抽出」っていったい何をしたいの?とか、 roke2を40文字で切った後にrokeとくっつけてるけど良いの?とか、 見えない事ばかりなのです。 なので、「こういう方向性で作ってみてはどうですか?」というヒントが提示されている、と。 それ以上の事は書けないし、もし自力でここまでのコードを書いたなら、 落ち着いて仕様を固めてみればここに提示されたヒントで作り切れるのでは、 という思いもあるのかな、と。 (ご近所PG)
to いまちゃんさん 40文字を越えたときの結果のサンプルを掲載して下さい。
そうすれば、きっと ***** さん が・・・ m(~д~m)〜 σ""〜
あと、 83,111,117,108,109,97,110 さんもいるし・・ m(~д~m)〜 σ""〜
(INA)
83,111,117,108,77,97,110 さん、が正解ですね。 とあくまでも冷静に突っ込む私。 (ご近所PG)***** さんはなんの事やらサッパリですけどネ
すみません。 109 → 77 でしたね。
>なんの事やらサッパリですけどネ (*~ρ~)σ -90446
(INA)
('-'*)(,_,*)('-'*)(,_,*) ウンウン CHAR(HEX2DEC("53"))&CHAR(HEX2DEC("6F"))&CHAR(HEX2DEC("75"))&CHAR(HEX2DEC("6C"))&CHAR(HEX2DEC("4D"))&CHAR(HEX2DEC("61"))&CHAR(HEX2DEC("6E")) さんですね! (^_^A; (川野鮎太郎)
분석toolが必要なのね。 (INA)
ぶはっ!今度は韓国語ですか_/ ̄|○ il||li 18988,16463 Toolです。 INA씨가 정말로 망가졌다. (川野鮎太郎)
E F E F 2 C100-101 2 C100-101,104,107-108,110,112-126 2.01 C104 3 C102-103,105-106,109,111,127-152,C154-172 2.02 C107-108 3.01 C175-177,179-186,188-203 2.03 C110 2.04 C112-126 3 C102-103 3.01 C105-106 → 3.02 C109 3.03 C111 3.04 C127-152 3.05 C154-172 3.06 C175-177 3.07 C179-186 3.08 C188-203
上記のような結果になるようにしたのですが・・・(いまちゃん)
文字数オーバーしてない? (INA)
E列、上下を比較して同じものがひとつもないように見えるのは気のせいでしょうか(汗 これは数値じゃなくて、章立てみたいな項目で 整数部分だけを比較して同じかどうかを判別して 小数点以下は、実は少数じゃなくて枝番の意味で使っていて、 40字からあふれた続きは .01、.02と追加で振って再度40字ごとに区切っていく・・・と そういうこと?
確かに3が41文字ありますね^^; (怜子)
216さんが中々快調に飛ばしていらっしゃいましたが気を取り直しつつ考えるに、 いまちゃんの提示された結果イメージの中で、 E列の3の行のラストの C154-172 の頭のCは必要ですか? それとも消し忘れですか? あと、怜子さんと同じ疑問ですが 変換後のE列の3.01といった値は、 変換前のE列の3.01をそのまま有効にしているんですか? それともF列が40文字を超え、2行になってしまう場合は 3という数字に0.01ずつ足していった結果をE列に入れているんですか? あと、F列の値は必ず アルファベット1桁+数値3桁 アルファベット1桁+数値3桁+ハイフン+数値3桁 というケースしか無いのですか? あと、F列の文字列の結合は E列の整数部の一致を持ってのみ判断してよいのですか? F列のアルファベットによって何か判断していたりはしませんか? あと、 いまちゃんがせっかく書いたコードがある訳ですが、 それを修正して何とか動くよう頑張れないですか? 時間があるならもうちょっと色々頑張って見ませんか? もったいないし。 (ご近所PG)
色々なアドバイスありがとうございます。 >E列の3の行のラストの C154-172 の頭のCは必要ですか? >それとも消し忘れですか? 申し訳ないです。Cは消し忘れです。 40文字を超えてしまった場合3という数字に0.01ずつたしてます。 アルファベットは1桁とはかぎらないです。 E列の整数部のみでの判断です。
質問しているのに意図がわかりにくい例等をあげて大変申し訳ないですm(_ _)m
色々がんばってつくった結果が上記コードです・・・どこをなおしたらいいのか
検討がつかなくなってしまいました。(いまちゃん)
最初のコードを見てると他にも仕様がありそうでならないんだけど、 最初にコメントにあった「カテゴリ」とは アルファベットのことですか? それとも、数値の事ですか? カテゴリが一致していない場合に何か処理しようとしていませんでしたか? (ご近所PG)
とりあえず、最後のchigau:の前の行に sh = sh - 1 を入れたら並びは良くなるようです。 原因としては、最初にE1とE2を合わせた時点で、次がE2とE3の比較になってるからかな・・・。
あとは番号を3から3.01にするだけかな? それから、近所のPGさんがおっしゃってた、suuchi2 が全然意味無いんですが・・・
追加:最初のKoumoku = Int(Cells(sh, 5)) '上の項目 の下に If sh <> 1 Then If Int(Cells(sh, 5)) = Int(Cells(sh - 1, 5)) Then Cells(sh, 5) = Koumoku + 0.01 End If End If で、数値も変わります。 もっと良い方法があると思いますが、とりあえず動きました。 ( ̄0 ̄;アッ、これじゃあ、3.02にならないや_/ ̄|○ il||li 失礼しましたm(._.)m ペコッ
(川野鮎太郎)
すみません。途中は、よく読んでいません。 分からないところは、独断と偏見汗 結果合わせ???これでお許しをぉ〜〜〜 (SoulMan) Option Explicit Sub 文字の集計() Dim MyA As Variant, MyAry() As Variant, MyKey As String, MyItem As Double Dim i As Long, j As Double, k As Long With Worksheets("Sheet1") MyA = .Range("E1", .Range("E65536").End(xlUp).Offset(1)).Resize(, 2).Value ReDim Preserve MyAry(1 To UBound(MyA, 1), 1 To 2) 'カウンター k = k + 1 'イテムカウンターj j = 0 'イテムの取得 MyItem = Int(MyA(1, 1)) 'キーの取得 MyKey = Left(MyA(1, 2), 1) '配列に代入 MyAry(1, 1) = MyItem For i = 1 To UBound(MyA, 1) - 1 'E列が同じイテムだったら If MyItem = Int(MyA(i, 1)) Then 'F列がキーと同じだったら If MyKey = Left(MyA(i, 2), 1) Then '配列の最初が空白じゃなかったら If Not IsEmpty(MyAry(k, 2)) Then '配列に追加しても40をこえなかったら If Len(MyAry(k, 2) & "," & Mid(MyA(i, 2), 2)) <= 40 Then '英字を除いて配列に追加 MyAry(k, 2) = MyAry(k, 2) & "," & Mid(MyA(i, 2), 2) Else '40を超えるばあいはカウンターを追加して配列に代入 k = k + 1 j = j + 0.01 MyAry(k, 1) = Int(MyA(i, 1)) + j MyAry(k, 2) = MyA(i, 2) End If Else '空白つまり先頭だったらそのまま配列に代入 MyAry(k, 2) = MyA(i, 2) End If 'F列のキーがちがったら Else '配列の最初が空白じゃなかったら If Not IsEmpty(MyAry(k, 2)) Then '配列に追加しても40をこえなかったら If Len(MyAry(k, 2) & "," & MyA(i, 2)) <= 40 Then 'そのまま配列に追加 MyAry(k, 2) = MyAry(k, 2) & "," & MyA(i, 2) 'キーの更新 MyKey = Left(MyA(i, 2), 1) Else '40を超えるばあいはカウンターを追加して配列に代入 k = k + 1 j = j + 0.01 MyAry(k, 1) = Int(MyA(i, 1)) + j MyAry(k, 2) = MyA(i, 2) End If Else '空白つまり先頭だったらそのまま配列に代入 MyAry(k, 2) = MyA(i, 2) End If End If 'E列のイテムがちがったらカウンターをプラスして配列に代入 Else k = k + 1 MyAry(k, 1) = Int(MyA(i, 1)) MyAry(k, 2) = MyA(i, 2) 'イテムの更新 MyItem = Int(MyA(i, 1)) 'イテムカウンターの更新 j = 0 End If Next End With With Worksheets("Sheet2") .Cells.ClearContents .Range("A1", .Range("A" & k)).Resize(, 2).Value = MyAry .Columns.AutoFit End With Erase MyA, MyAry End Sub 追伸!E列とF列だったのね汗 ちょっと、訂正 2004/10/7 21:35 2004/10/8 6:30 2004/10/8 9:35 2004/10/8 15:20 変数の型を変更しました。 ちゃんとけじめだけはつけておかないとねv(=∩_∩=)v (SoulMan)
83,111,117,108,77,97,110 さんの手によって答えの一例が出た様なので… 私的マクロと、 いまちゃん的マクロ修正案を載せてみます。 標準モジュールに以下を全部ペッタリと貼り付けて見る。 〜〜〜〜〜ここから〜〜〜〜〜 Option Explicit
Private Type typA dblKoumoku As Double strRoke As String strCat As String End Type
Sub ご近所PG的マクロ() '変数宣言 Dim udtA() As typA Dim udtWk As typA Dim strWk As String Dim intIdx As Integer Dim lngIdx As Long Dim lngPos As Long Dim lngRow As Long Dim lngRowCount As Long Dim strRoke As String '定数宣言 Const Cst_lngMaxLen As Long = 40 '何文字以上だったら行を切り替えるか Const Cst_dblCountUp As Double = 0.01 '行を切り替える場合のカウントアップ数 Const Cst_lngRowMax As Long = 65536 '対象行範囲 Const Cst_lngColKoumoku As Long = 5 '項目が格納される列位置 Const Cst_lngColRoke As Long = 6 'ロケが格納される列位置
'**************** '*** 処理開始 *** '****************
'初期化 ReDim udtA(0 To 0) '対象範囲最終行 lngRowCount = Range(Cells(Cst_lngRowMax, Cst_lngColKoumoku), _ Cells(Cst_lngRowMax, Cst_lngColKoumoku)).End(xlUp).Row '1行目から値が入っている最後の行まで処理 For lngRow = 1 To lngRowCount '項目が空欄なら抜ける If Cells(lngRow, Cst_lngColKoumoku) = "" Then Exit For End If '値を加工しつつ保持 With udtWk .dblKoumoku = Int(Cells(lngRow, Cst_lngColKoumoku).Text) '項目の取得 .strRoke = Cells(lngRow, Cst_lngColRoke).Text 'ロケの取得 'ロケの先頭のアルファベット(カテゴリ?)取得 strWk = "" For intIdx = 1 To Len(.strRoke) strWk = StrConv(Mid(.strRoke, intIdx, 1), vbUpperCase) Select Case strWk Case "A" To "Z" Case Else strWk = Left(.strRoke, intIdx - 1) Exit For End Select Next .strCat = strWk End With '初期化 strRoke = "" lngPos = -1 '同一キーを持つものが過去あったか調べる For lngIdx = LBound(udtA) To UBound(udtA) - 1 With udtA(lngIdx) 'キー項目が同じ If .dblKoumoku = udtWk.dblKoumoku Then If .strCat = udtWk.strCat Then 'カテゴリが一致していたら 'カテゴリを削除して扱う strWk = Mid(udtWk.strRoke, Len(udtWk.strCat) + 1) Else 'カテゴリ付きで扱う strWk = udtWk.strRoke End If '文字列結合 strRoke = .strRoke & "," & strWk '文字長をチェック If Len(strRoke) > Cst_lngMaxLen Then '指定文字数を超えそうなら 'キー項目カウントアップして再検査 udtWk.dblKoumoku = udtWk.dblKoumoku + Cst_dblCountUp Else '同じものが見つかった事とする lngPos = lngIdx End If End If End With '見つかったら抜ける If lngPos <> -1 Then Exit For End If Next If lngPos = -1 Then '同じものが見つからないなら '配列拡張 lngPos = UBound(udtA) ReDim Preserve udtA(0 To lngPos + 1) '値格納 With udtA(lngPos) .dblKoumoku = udtWk.dblKoumoku .strRoke = udtWk.strRoke .strCat = udtWk.strCat End With Else '見つかったなら '値セット With udtA(lngPos) .strRoke = strRoke .strCat = udtWk.strCat '今回のカテゴリ文字を保持 End With End If Next '出力セル範囲を個別にクリア Range(Cells(1, Cst_lngColKoumoku), Cells(lngRowCount, Cst_lngColKoumoku)).ClearContents Range(Cells(1, Cst_lngColRoke), Cells(lngRowCount, Cst_lngColRoke)).ClearContents '結果出力 For lngRow = 1 To UBound(udtA) With udtA(lngRow - 1) Cells(lngRow, Cst_lngColKoumoku) = .dblKoumoku Cells(lngRow, Cst_lngColRoke) = .strRoke End With Next MsgBox "処理終了" End Sub
Sub いまちゃん的マクロ() Dim sa As Long Dim sh As Long Dim Koumoku As String Dim Koumoku2 As String Dim Roke As String Dim Roke2 As String Dim Kategori As String Dim Kategori2 As String Dim i As Integer '初期設定 sa = 1 'ベースとなる場所 sh = 2 '検索開始位置 Cells(sa, 5) = Int(Cells(sa, 5)) 'ベースとなる場所の項目を整数化しておく Roke = Cells(sa, 6) 'ベース位置のロケ取得 'ベース位置のカテゴリ取得 Kategori = "" For i = 1 To Len(Roke) Select Case Mid(Roke, i, 1) Case "A" To "Z" Case Else Kategori = Left(Roke, i - 1) Exit For End Select Next '検索開始位置から値が空欄になるまで繰り返し Do If sh >= 65536 Then Exit Do '最大行数に達したら抜ける If Cells(sh, 5) = "" Then Exit Do 'E列が空なら抜ける Koumoku = Int(Cells(sa, 5)) 'ベース位置の項目を整数化して変数に Koumoku2 = Int(Cells(sh, 5)) '検索位置の項目を整数化して変数に If Koumoku = Koumoku2 Then 'もしベースとなる位置と検索位置の項目が等しければ Roke = Cells(sa, 6) 'ベース位置のロケ取得 Roke2 = Cells(sh, 6) '検索位置のロケ取得 '検索位置のカテゴリ取得 Kategori2 = "" '検索位置カテゴリ初期化 For i = 1 To Len(Roke2) Select Case Mid(Roke2, i, 1) Case "A" To "Z" Case Else Kategori2 = Left(Roke2, i - 1) Exit For End Select Next If Kategori = Kategori2 Then 'カテゴリが一致しているなら '何もしない Else 'カテゴリが不一致なら 'ベース位置の最終カテゴリとして検索位置のカテゴリを保持 Kategori = Kategori2 '検索位置のロケでカテゴリを有効とするため検索位置のカテゴリは空欄だった扱いとする Kategori2 = "" End If Roke2 = Mid(Roke2, Len(Kategori2) + 1)'カテゴリを考慮したロケを取得 If Len(Roke & "," & Roke2) > 40 Then 'もし40文字を越えるなら sa = sa + 1 'ベース位置を進めて Cells(sa, 5) = Cells(sa - 1, 5) + 0.01 '直前のベース位置の項目に0.01プラスした物をセット Cells(sa, 6) = Cells(sh, 6) '検索位置のロケをベース位置へセット Else '40文字を越えないなら 'ベース位置とアルファベットを削った検索位置のロケを繋いでベース位置へセット Cells(sa, 6) = Roke & "," & Roke2 End If Else 'もしベースとなる位置と検索位置の項目が等しくなければ sa = sa + 1 'ベース位置を進めて Cells(sa, 5) = Int(Cells(sh, 5)) '検索位置の項目を整数化してベース位置へセット Cells(sa, 6) = Cells(sh, 6) '検索位置のロケをベース位置へセット End If '検索位置の変更 If sa <> sh Then 'ベース位置と検索位置が等しくないなら 'その行を削除する 自動的に次の行が検索位置に来る Range(Cells(sh, 5), Cells(sh, 6)).Delete shift:=xlUp Else 'ベース位置と検索位置が等しいなら sh = sh + 1 '検索位置を進める End If Loop End Sub 〜〜〜〜〜ここまで〜〜〜〜〜
いまちゃん的マクロの方がシンプルにまとまった罠。
ちなみに川野鮎太郎さん指摘の >sh = sh - 1 についてですが、ループカウンタに使用している変数を そのループ内でいじくるのはあまり好ましく無いです。 動くかもだけど、ちと怖い。 なのでいまちゃん的マクロではFor〜NextではなくDo〜Loopとしました。 E列に値が無ければ抜けるんで、それで問題ないでしょう。 期待と違う動きをする場所があれば修正してください。 追記:想定外の値が来た時の事は全然考えてません。 (ご近所PG)それにしても私ぁエクセル的な書き方ってのがどうもまだ出来ない。
(・0・*)ホ,(゜0゜*)ホ--ッッ!!! >ループカウンタに使用している変数をそのループ内でいじくるのはあまり好ましく無いです。 そうなんですか〜(^_^A; 今回もまた禁じ手使ってしまったわけですね_/ ̄|○ il||li 前にも、GoToでどこかに入るのは怖いって言われましたね(^_^A; 動けばイイや的マクロばっかりだったから、その辺の決まりごとが全然?(゜_。)? ご指摘ありがとうございました。m(_ _)m (川野鮎太郎)
勉強のためにみなさんのコードを実行していたら、以下のようなことになりました(ノ_・。) 83,111,117,108,77,97,110 さんのは、型が一致しませんで止まってしまった_/ ̄|○ il||li If Len(MyAry(k, 2) & "," & Mid(MyA(i + 1, 2), 2)) <= 40 Then ←ここ
*****さん的マクロは、変数宣言のときにコンパイルエラー、ユーザ定義型は定義されていません。?(゜_。)? いまちゃん的マクロは、C以外の文字、仮にD101などがある場合にDが消えてしまう。(?_?) これについては、当初のコードはD101のままつながるコードだったはずです。 (川野鮎太郎)
鮎ちゃん、ぉはょ!アップしました。試してみてください。 どんなデータの時にとまりますか?止まった時kやiはいくつになっていますか? v(=∩_∩=)v (SoulMan) http://ryusendo.no-ip.com/cgi-bin/upload/src/up0085.xls
おはょぅございます。眠い。
>*****さん的マクロは、変数宣言のときにコンパイルエラー、ユーザ定義型は定義されていません。?(゜_。)? ん?Privete Type typA〜の部分は記述されてるでしょうか。
>いまちゃん的マクロは、C以外の文字、仮にD101などがある場合にDが消えてしまう。(?_?) なるほど、そういう動きだったのね。 いまちゃんの方からアルファベットについて特に言われてないので無視りました。 後で上記コードに追加修正してみようか… (ご近所PG)
おはようございます。 ご近所PGさんのコードもためしましたが、別段問題はないようにおもいます。 ただ、ご近所PGさんのコードを同じ標準モジュールでも一番先頭に記述しておかないと 鮎ちゃんのいうようなことになろうかと思います。 私のコードをモジュール1にご近所PGさんのコードをモジュール2に記述してみると どうなりますか??? Dの件は関知しておりません。あしからず、、、 一応、私のコードも変数の型をかえました。 (SoulMan)
モジュールを分けていたので、ご近所PGのはユーザ定義型は定義されていませんになったんですね。 すいませんでしたm(._.)m ペコッ 上のPrivete Type typA〜を入れたら、ばっちりでした!!! 処理のスピードも、さすが(_ _ ;)尸"マイリマシタ・・・ってほど早いです!!。
Manちゃんのは・・・またもや型が違います_/ ̄|○ il||li 場所は同じ場所です。 実行時エラー13 MyAがエラー2015で格納されてませんね(ノ_・。) ※アップしてあるファイルでお試しボタンを゙(*・・)σ【】ぽちっとな♪したら・・・ 何も反応しないし_/ ̄|○ il||li あああああ!!!Sheet2にあった_/ ̄|○ il||li 失礼しましたm(._.)m ペコッ ぎゃ!!!判りました!!! データがSheet1じゃなかったからでした_/ ̄|○ il||li よく確認せずに失礼こきまくりましたm(._.)m ペコッ (川野鮎太郎)
そうそう、私のは新規で標準モジュール作ってそれに全部ペッタリ貼り付けてください。 説明不足失礼。SoulManさんフォローありがとうございます。 で、〜ここから〜ここまで〜のコードを、 カテゴリ(アルファベット)差異対応したコードに修正しておきました。
>ほぼ原型はありませんが・・・ いやぁ……………ハッハッハッハッハッハッハッハッハ……………とごまかしてみる。 (ご近所PG)ごまかせたに違いないと信じ込む
いまちゃんさんのスレなのに何回も失礼しております。 ご近所PGさん、確認しましたばっちりです。 そこでひとつお聞きしたいのですが、よく定数宣言を使われてますが、 そのメリットはどんなものがあるのでしょうか。 1.いくつも同じ定数を使うときに判りやすい 2.定数の内容の修正が簡単 3.処理の速度が速くなる(?) いろいろ質問してすいません・・・。 (川野鮎太郎)
自分自身まだまだ勉強不足を実感させられました・・・(いまちゃん)
出来れば処理内容を把握して仕様変更あった時にバシっと対応出来るようにしとくとかこいいです。
>そのメリットはどんなものがあるのでしょうか。 私的には >1.いくつも同じ定数を使うときに判りやすい >2.定数の内容の修正が簡単 の二つ。3は解らないです。 例えば先日、なんか77行で2列にするだとかいう処理があって、 後日似た質問で55行だったかしら?に変更すれば動くという質問があったと思うけど、 77を直接使ってたから沢山数字を書き換えないといけなかった。 もし最初のコードで「77」を定数として宣言して使っていれば、 行数が変更になった時にその定数値を1箇所直すだけでコード全体が直る、と、 あとは直接「77」って書くと何の事?っていう感じだけど、 解りやすい定数名をつけておけば後々見た時に解りやすい、と。 そういう感じで。 (ご近所PG)
なるほど!!!納得です〜。 てか・・・・77行の・・・って・・・(*/∇\*)キャ 見てらしたのね(/-\*) ハジュカチ… 確かに宣言しておけば一箇所変えれば良いだけですよね。 ありがとうございました。m(._.)m ペコッ (川野鮎太郎)
ついでだから追記 ネットで「マジックナンバー」「プログラム」という単語で検索して見てください。 (ご近所PG)
見てきました(◎_◎) ジー!! http://www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/example/MagicNumber.html とってもとっても判りやすく書いてあり理解できました。 大変参考になりました。m(._.)m ペコッ (川野鮎太郎)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.