Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9716 / 13644 ツリー ←次へ | 前へ→

【25789】繰り返し たま 05/6/14(火) 21:24 質問[未読]
【25790】Re:繰り返し かみちゃん 05/6/14(火) 21:36 回答[未読]
【25792】Re:繰り返し ichinose 05/6/14(火) 21:43 発言[未読]
【25794】Re:繰り返し たま 05/6/14(火) 22:18 質問[未読]
【25795】Re:繰り返し かみちゃん 05/6/14(火) 22:44 回答[未読]
【25796】Re:繰り返し ichinose 05/6/14(火) 22:54 発言[未読]
【25798】Re:繰り返し たま 05/6/14(火) 23:12 お礼[未読]
【25799】Re:繰り返し ichinose 05/6/14(火) 23:38 発言[未読]
【25801】Re:繰り返し 追伸 ichinose 05/6/15(水) 0:03 発言[未読]
【25827】Re:繰り返し 追伸 たま 05/6/15(水) 20:39 お礼[未読]
【25791】Re:繰り返し だるま 05/6/14(火) 21:40 回答[未読]

【25789】繰り返し
質問  たま  - 05/6/14(火) 21:24 -

引用なし
パスワード
   マクロを初めて作ってみました。(といっても自動作成ですが・・)
内容は日付のデータの入ったセルがA列にずら〜っとあります。
これを、G、H、Iのセルに年、月、日と分けます。
20050614→05|06|14
となるわけなのですが・・・

Sub 桁分ける()
'
  Range("G2").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-6],3,2)"
  Range("H2").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-7],5,2)"
  Range("I2").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-8],7,2)"
  Range("G3").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-6],3,2)"
  Range("H3").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-7],5,2)"
  Range("I3").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-8],7,2)"
  Range("G4").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-6],3,2)"
  Range("H4").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-7],5,2)"
  Range("I4").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-8],7,2)"
  Range("G5").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-6],3,2)"
  Range("H5").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-7],5,2)"
  Range("I5").Select
  ActiveCell.FormulaR1C1 = "=MIDB(RC[-8],7,2)"
  
  End Sub

何回もやってるうちに鬱になってきました・・・
簡単に作る方法ってどうするんですか?
以前の投稿を参考にしようと思っても内容が??です。

【25790】Re:繰り返し
回答  かみちゃん  - 05/6/14(火) 21:36 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>マクロを初めて作ってみました。(といっても自動作成ですが・・)
>内容は日付のデータの入ったセルがA列にずら〜っとあります。
>これを、G、H、Iのセルに年、月、日と分けます。
>20050614→05|06|14
>となるわけなのですが・・・

「データ」−「区切り位置」の操作ではいけませんか?
そのマクロが必要でしたら、マクロの記録でできます。

こんな感じです。
Sub Macro1()
  Columns("A:A").Select
  Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
    FieldInfo:=Array(Array(0, 2), Array(4, 2), Array(6, 2), Array(8, 1)), _
    TrailingMinusNumbers:=True
  Range("A1").Select
End Sub

【25791】Re:繰り返し
回答  だるま WEB  - 05/6/14(火) 21:40 -

引用なし
パスワード
   こんにちは

素直?に一つづつ分解する例です。^d^

Sub test()
  Dim myRange As Range
  Dim myCell As Range
  
  Set myRange = Range("A1")
  Set myRange = Range(myRange, Range("A65536").End(xlUp))
  
  For Each myCell In myRange.Cells
    With myCell
      .Offset(, 6).Value = Mid$(.Text, 3, 2)
      .Offset(, 7).Value = Mid$(.Text, 5, 2)
      .Offset(, 8).Value = Mid$(.Text, 7, 2)
    End With
  Next
  
  Set myCell = Nothing
  Set myRange = Nothing
End Sub

【25792】Re:繰り返し
発言  ichinose  - 05/6/14(火) 21:43 -

引用なし
パスワード
   たまさん、かみちゃん さん、こんばんは。

色々と方法はありますが、数式を使うなら、

sub test()
  With Range("g2:i30")
   .Formula = Array("=mid(a2,3,2)", "=mid(a2,5,2)", "=mid(a2,7,2)")
   End With
End Sub

これは、A2〜A30をG,H,Iに分解する例です。
セルの相対参照の特徴を使っています。

確認して下さい。

【25794】Re:繰り返し
質問  たま  - 05/6/14(火) 22:18 -

引用なし
パスワード
   ichinose さん、たまさん、かみちゃんさん
さっそくの返事ありがとうございます。

さっそく、みなさんのVBAを真似て作ってみました。
ichinoseさんのが一番希望に近かったのですが、
30行目までしかできなかったので、
ちょっとだけ改造してみたのですが・・↓


Sub test()
  With Range("g2:i65536")
   .Formula = Array("=mid(a2,3,2)", "=mid(a2,5,2)", "=mid(a2,7,2)")
   End With
End Sub

こうすると、見事に一番下まで数式が入ってしまいました(汗)
データのある行までで止めるにはどうしたらいいですか??

あと、=mid(a2,3,2)・・・とありますが
このa2とゆうのは、次の行になると勝手にa3と認識する
とゆうイメージでいいんですか??

初心者なのでしょうもない質問ですがよろしくお願いします。

【25795】Re:繰り返し
回答  かみちゃん  - 05/6/14(火) 22:44 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>データのある行までで止めるにはどうしたらいいですか??

いろいろ方法はあるかと思いますが
データの入っているA列の最終行は、
Range("A65536").End(xlUp).Row
で取得できますので、
 With Range("g2:i" & Range("A65536").End(xlUp).Row)
とすれば、最終行まで計算式が入ります。

>あと、=mid(a2,3,2)・・・とありますが
>このa2とゆうのは、次の行になると勝手にa3と認識する
>とゆうイメージでいいんですか??

With Range(〜
の〜が計算式を設定するセル範囲なので、数行のセルにして、どうなるか確認してみてください。
結論として、「相対参照」ですから・・・それでいいです。

【25796】Re:繰り返し
発言  ichinose  - 05/6/14(火) 22:54 -

引用なし
パスワード
   ▼たま さん:


Sub test()
  With Range("a2", Range("a65536").End(xlUp)).Offset(0, 6).Resize(, 3)
'  これは、かみちゃんさんのコードが簡単でよいですね
   .Formula = Array("=mid(a2,3,2)", "=mid(a2,5,2)", "=mid(a2,7,2)")
   End With
End Sub
として下さい。
with 以下がどうしてこうなるのか はひとつひとつのプロパティを調べてみて下さい。

>あと、=mid(a2,3,2)・・・とありますが
>このa2とゆうのは、次の行になると勝手にa3と認識する
>とゆうイメージでいいんですか??

例えば、手動操作で

セルB2に「=a2」と指定するとA2の内容が表示されますよね?
このセルB2を選択し、「右クリック」---「コピー」を行い、
続けてセルB3を選択し、「右クリック」---「貼り付け」を行えば
セルB3には、「=a3」に相当するデータが表示されますよね。
この性質をコード内で利用しています。
これは、いろんな事象で使えると思いますよ!!
後は、こういう方法で数式を利用する場合は、A1形式の参照方法だけでなく、
R1C1形式のセル参照もよく理解しておいて下さい。
(R1C1形式でないと、面倒な場合もありますから)

以上です。

【25798】Re:繰り返し
お礼  たま  - 05/6/14(火) 23:12 -

引用なし
パスワード
   かみちゃんさん、ichinoseさんありがとうございました。
とりあえずは問題回避できました。

コードの解読はこれからやっていきます。。

ちなみに、
VBAハンドブックとゆう本(かなりゴツイ)
を買ったのですが、
オブジャクト
プロパティ
メソッド
ってなんですか?いっぱいでてくるんですが
意味が何度説明を読んでもわかりません・・・

【25799】Re:繰り返し
発言  ichinose  - 05/6/14(火) 23:38 -

引用なし
パスワード
   ▼たま さん:
>VBAハンドブックとゆう本(かなりゴツイ)
>を買ったのですが、
>オブジャクト
>プロパティ
>メソッド
>ってなんですか?いっぱいでてくるんですが
>意味が何度説明を読んでもわかりません・・・
お聞きした限り、今の段階では、

VBAは、Excel内にある様々な部品(Excelそのものから始まって、ブック、
シート、セル、グラフ、オ−トシェイプ・・・)を操作する事で処理を自動化させます。
この部品を操作することがプログラムの大半を占めてしまいます。

この部品の事をオブジェクトだ と今の段階では理解して頂いてよいかと
思います。深い定義に関してはもう少し経ってからということで・・。

この部品の性質にあたるデータを取得したり設定したりする窓口が
プロパティになります。
Range("B2").Formula="=a1"
Formulaというプロパティを使って、数式というデータを設定しています。

又この部品の持っている能力を使おうとした場合、メソッドという手続きを使います。

Range("C3").Select SelectメソッドによってセルC3を選択。

最初は、この程度に理解されていれば良いかと思います。
私もそうでした。VBAの理解が深まっていけば、これらについても
より深い概念が理解できると思います。

【25801】Re:繰り返し 追伸
発言  ichinose  - 05/6/15(水) 0:03 -

引用なし
パスワード
   それから、VBAをこれから理解しようとされているのでしたら
何でも良いですからご自分で仕様を記述して
完成品を作成する事だと思います。
最初は、たまさんがなされていたようにマクロの記録から始めて・・・。

躓いたら、またこのサイトでご質問ください。

VBAを始まられたばかりの方のご質問とは思えないほど
分かりやすく記述された内容でした。

・プログラムの機能にあたる 「やりたい事」の記述

・例題を使っての入力データと出力データの記述

・コードの記述

素晴らしい!!

では、頑張って下さい!!

 

【25827】Re:繰り返し 追伸
お礼  たま  - 05/6/15(水) 20:39 -

引用なし
パスワード
   ichinoseさん

ありがとうございます。
かなり難しいとは思いますが、がんばって仕上げたいと
思います。
また、なにかありましたら教えてくださいね。。

ありがとうございました。

9716 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free