[[20041007131915]] 『VBA:文字数制限』(いまちゃん) >>BOT

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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)


同じでないのもあります。比較は整数のみの比較で行っています。
説明不足でしたが、やりたい事は40文字にたっするまで合成を続けたいです。
最初は下から合成していたのですが、それですと一番上が少なくなってしまいます。
   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)


行削除せずclearするだけにしたのですが、
   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씨가 정말로 망가졌다.
 (川野鮎太郎)


説明不足で大変申し訳ないですm(_ _)m

 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

みなさまおはようございます。朝開けてみたらビックリするほど回答がきていたので
感謝感激です。早速検証させていただきますm(_ _)m(いまちゃん)

 おはょぅございます。眠い。

 >*****さん的マクロは、変数宣言のときにコンパイルエラー、ユーザ定義型は定義されていません。?(゜_。)?
ん?Privete Type typA〜の部分は記述されてるでしょうか。

 >いまちゃん的マクロは、C以外の文字、仮にD101などがある場合にDが消えてしまう。(?_?)
なるほど、そういう動きだったのね。
いまちゃんの方からアルファベットについて特に言われてないので無視りました。
後で上記コードに追加修正してみようか…
(ご近所PG)

 おはようございます。
ご近所PGさんのコードもためしましたが、別段問題はないようにおもいます。
ただ、ご近所PGさんのコードを同じ標準モジュールでも一番先頭に記述しておかないと
鮎ちゃんのいうようなことになろうかと思います。
私のコードをモジュール1にご近所PGさんのコードをモジュール2に記述してみると
どうなりますか???
Dの件は関知しておりません。あしからず、、、
一応、私のコードも変数の型をかえました。
(SoulMan)

またも説明不足ですいません・・・
E列データが同じでF列のデータが、C101その下がD101の場合(アルファベットが違う場合)
はC101,D101となるようにしたいです。ご近所PGさんが私のコードを修正してくれたので
非常にわかりやすかったです。ほぼ原型はありませんが・・・(いまちゃん)

 モジュールを分けていたので、ご近所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.処理の速度が速くなる(?)
 いろいろ質問してすいません・・・。
 (川野鮎太郎)

ご近所PGさん ありがとうございましたm(_ _)mまさにやりたかったことの全て解決です!
他の方にもたくさんの回答していただきありがとうございました。

自分自身まだまだ勉強不足を実感させられました・・・(いまちゃん)


 出来れば処理内容を把握して仕様変更あった時にバシっと対応出来るようにしとくとかこいいです。

 >そのメリットはどんなものがあるのでしょうか。
私的には
 >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.