0

だから私は単純に別のExcelファイルを開き、選択したセルに移動して最後に移動し(正しい方向に)、最新の塗りつぶされたセルを取得するためにExcelで簡単なマクロを作成(および動作)しました(これは1で拡張されるため)毎月)

範囲を設定するには、最後と最後が何であれ-73の2ポイントを取得する必要がありました。最新のセルを選択した後、列番号を取得しました(つまり、A = 1、6 = fなど...)、そして次に、これを解析する関数を呼び出して、列の文字を再度返しました。

これを行っているときに、論理的に混乱し、なぜこれが起こるのか理解できない何かに出くわしたので、そこの第一人者がこれを私に説明してくれることを願っています.

コードでわかるように、2 つの整数が宣言されています。

  • 始める
  • フィン

目的のセルに到達したら、ActiveCell 列に fin = を作成します。私は単純にそうします;

Start = fin - 73

しかし、関数 ConvertToLetter を呼び出すと、start を通過したときに型の不一致エラーが発生したため、強制的に通過させました。

ref1 = ConvertToLetter(CInt(start))

そして、それはうまくいきました。

完全なコード;

Sub Test()

Dim rng         As Range
Dim start, fin  As Integer
Dim ref1, ref2  As String
Dim file, tabn  As String
Dim XL          As Object
Dim wkb         As Excel.Workbook
Dim wks         As Excel.Worksheet

Set rng = Range("C149")
file = "<File name>"
tabn = "<Tab Name>"

Set XL = CreateObject("Excel.Application")
XL.Application.Visible = True

XL.AskToUpdateLinks = False
XL.DisplayAlerts = False
XL.Application.Workbooks.Open (file)

Set wkb = XL.ActiveWorkbook
Set wks = wkb.Sheets(tabn)

wks.Activate

Set rng = wks.Range("C149")

rng.Select
rng.End(xlToRight).Select

fin = XL.ActiveCell.Column
start = fin - 73

If VarType(start) = vbInteger Then Debug.Print "Its an int!"
If VarType(start) = vbLong Then Debug.Print "Its a long!"
If VarType(start) = vbSingle Then Debug.Print "Its a single?"
If VarType(start) = vbDouble Then Debug.Print "ew double"

wkb.Close
XL.AskToUpdateLinks = True
XL.DisplayAlerts = True
XL.Quit

Set rng = Range("a1")
rng.Select


ref1 = ConvertToLetter(CInt(start))
ref2 = ConvertToLetter(fin)

End Sub

Function ConvertToLetter(iCol As Integer) As String
   Dim iAlpha As Integer
   Dim iRemainder As Integer
   iAlpha = Int(iCol / 27)
   iRemainder = iCol - (iAlpha * 26)
   If iAlpha > 0 Then
      ConvertToLetter = Chr(iAlpha + 64)
   End If
   If iRemainder > 0 Then
      ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
   End If
    End Function

書式設定と醜い if ステートメントを許してください (これは、start が int であることを確認するためだけにありました)

私を困惑させたのは、ifステートメントを通過したときに、「それはintです!」を返したことです。

では、なぜ開始を許可する関数が解析されなかったのでしょうか?

なんとか回避できました

ref1 = ConvertToLetter(CInt(start))

一般に、これを事前に適用した場合

Before:
start = fin - 73

After:
start = (fin - 73)

そして、CINT を使用して解析する必要がなくなりました。

しかし、start が int であるとは考えられなかった理由を誰かが説明できますか? そして、なぜそれを括弧で囲むのですか?

私の頭にはこの論理があります。

たとえば、2 つの int があり、それらに数学的な問題を適用すると、結果は常に int になります。3.33333333 ではなく、10 / 3 = 3

では、なぜこの場合は int ではなかったのでしょうか?

どうもありがとう。

4

2 に答える 2