문제

는 창조하지 않는(기능)그의 임무에 활성 휴(i.e선택)과 세트는 인접한 세포 어떤 값입니다.이 잘 작동합니다.

로 변환할 때는 하위 함수하고 그것을 평가하려고서에서 스프레드시트(즉설정의 수식가"=MyFunction()")Excel 껍질에 있다는 사실을하려고의 가치에 영향을 미치는 비 활성 셀,단순히 강제로 기능을 반환하#값이 닿지 않고 인접한 세포입니다.

그것은 이 보호는 동작?하지 않을 경우,무엇을 얻을 수있는 좋은 방법 수 있습니다.나는 뭔가를 찾고 있는 유능한 개발자를 달성할 수 있을 통해 1-2 주 동안,가능한 경우.

감사합니다, Alan.

참고:내가 사용하여 2002 년,그래서 나는 것을 선호하는 솔루션을 작동할 것입되는 버전입니다.그 이후 버전이 훨씬 쉽게,나는에 대해 알고 싶습니다.

도움이 되었습니까?

해결책

그것은 할 수 없는 말이기 때문에:

  • 워크시트가 함수가 호출,셀가 포함된 기능이 필요하지 않 active 셀입니다.그래서 당신을 찾을 수 없습니다 인접한 세포 안정적으로.

  • Excel 에서 다시 계산 워크 시트,그것을 유지하기 위해 필요하 간의 종속성을 세포입니다.그래서 그것을 허용할 수 없 워크시트 기능을 임의로 수정 다른 세포입니다.

당신이 할 수 있는 최고 중 하나입니다:

  • 처리 SheetChange 이벤트입니다.는 경우 포함하는 세포의 기능이 변경,수정할 수에 인접한 세포입니다.

  • 어 워크시트의 기능에 인접한 세포 값을 반환을 원합니다.

업데이트

에 대한 코멘트:"나는 같은 이 기능 이 작동하려면에'blank'스프레드시트,그래서 나는 정말 못에 의존하 SelectionChange 이벤트의 스프레드 시트는 아직 존재하지 않을 수도 있지만,필요가 이것을"기능:

  • 를 넣을 수 있습니의 함수에서는 기능 추가?그런 다음 기능 추가-에서 처리할 수 있는 응용 프로그램 SheetChange(*)이벤트에 대한 모든 통합에서 열리는 인스턴스의 Excel?

에 대한 코멘트:"여전히 유지하는 경우에 탁월 CalculationMode=xlManual 채우에 값을 잘 해야"

  • 경우에도 CalculationMode 은 xlManual,Excel 을 유지하기 위해 필요하고,종속성의 트리 참조 사는 세포 그렇게 계산할 수 있습니다.는 경우 하나의 기능 업데이트 할 수 있는 임의의 셀,이것이 순서입니다.는 아마도 왜 Excel 부과 이러한 제한을 받습니다.

(*)내가 원래 쓴 SelectionChange 위의,수정 지금의 올바른 이벤트 SheetChange 에 대한 통합 문서 또는 응용 프로그램 개체 또는 변경을 위한 워크시트 개체입니다.

업데이트 2 일부에 대한 발언 AlanR 의 게시물 을 설명하는 방법에'좀'작동하도록 사용하여 타이머:

  • 그것은 명확하지 않는 방식의 타이머 기능("와")이 알고 있는 세포를 업데이트합니다.당신 없는 정보를 나타내는 세포를 포함하는 공식 트리거 타이머입니다.

  • 는 경우에는 수식에 존재하는 하나 이상의 셀룰라에서(동일하거나 다른 통합 문서),다음은 UDF 될 것입니다 여러 번 호출하는 동안 재계산,덮어 쓰기 timerId.결과적으로,당신은 실패를 파괴 타이머를 안정적이고,누출 Windows 리소스입니다.

다른 팁

에 따르면 사용자 지정 사용자 정의 Excel 함수를 만드는 방법:

UDF의 한계

  • 공식을 포함하는 셀 (또는 범위) 이외의 셀에 값을 배치 할 수 없습니다. 다시 말해, UDF는 반드시 "매크로"가 아니라 "공식"으로 사용됩니다.

따라서 할 수없는 것처럼 보입니다.

Excel 2007을 사용하고 있으며 작동하지 않습니다. Excel은 그것이 원형 기준을 만듭니다. 다른 셀을 함수에서 변경할 수 있다고 생각하지 않고 값을 반환합니다.

그것은 일종의 기능적 프로그래밍이며 부작용이 없습니다. 함수 내부의 다른 셀을 변경할 수 있다면 (워크 시트에서 사용) Excel이 순서를 알 수있는 방법과 셀이 변경되면 재 계산할 내용이 없습니다.

이 기사 또한 Excel이 재 계산하는 방법에 대한 많은 정보가 포함되어 있습니다. 그러나 다른 세포는 얼어 붙었다는 것은 결코 나타나지 않습니다.

나는 당신이 무엇을하려고하는지 모르겠지만, 왜 인접한 셀에 다른 함수를 배치하지 않습니까? 첫 번째 셀을 매개 변수로 취합니다.

예시:

Public Function Bar(r As Range) As Integer
  If r.Value = 2 Then
    Bar = 0
  Else
    Bar = 128
  End If
End Function

응답 해주셔서 감사합니다. 이것을 할 수 있습니다! 좀. 기술적으로 '기능'이 그 주위의 세포에 영향을 미치지 않기 때문에 '킨다'라고 말합니다. 그러나 실제로 말하면, 어떤 사용자도 그 차이를 말할 수 없습니다.

트릭은 Win32 API를 사용하여 타이머를 시작하는 것이며, 꺼지 자마자 원하는 셀에 원하는 것을 수행하고 타이머를 끄는 것입니다.

이제 저는 COM 스레딩이 어떻게 작동하는지에 대한 전문가가 아니지만 (VBA가 단일 아파트라는 것을 알고 있지만) Excel 프로세스와 함께 타이머에 대해 조심하십시오. 이것은 실제로 다른 모든 스프레드 시트에 대한 솔루션으로 제안 할 것이 아닙니다.

이 내용이 포함 된 모듈 만 만드십시오.

Option Explicit

Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, _
  ByVal IDEvent As Long, ByVal mSec As Long, _
  ByVal CallFunc As Long) As Long

Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, _
  ByVal timerId As Long) As Long

Private timerId As Long

Private wb As Workbook
Private rangeName As String
Private blnFinished As Boolean

Public Sub RunTimer()

    timerId = SetTimer(0, 0, 10, AddressOf Woohoo)


End Sub


Public Sub Woohoo()

    Dim i As Integer

'    For i = 0 To ThisWorkbook.Names.Count - 1
'        ThisWorkbook.Names(i).Delete
'    Next

     ThisWorkbook.Worksheets("Sheet1").Range("D8").Value = "Woohoo"

     KillTimer 0, timerId

End Sub

Excel에서 이것을 할 수는 없지만 가능합니다. Resolver One (여전히 꽤 이상한 일이지만).

파이썬에서 사용자 정의 기능을 정의 할 수있는 스프레드 시트입니다. 그런 다음 그리드의 셀 포뮬라에서 호출 할 수 있습니다.

당신이 요구하는 것의 예로, 당신은 safeDivide (a ZeroDivisionError)는 분모 세포를 채색하고 그 옆에 오류 메시지를 표시하여 문제에 대해 말했습니다. 다음과 같이 정의 할 수 있습니다.

def safeDivide(numerator, cellRange):
    if not isinstance(cellRange, CellRange):
        raise ValueError('denominator must be a cell range')
    denominator = cellRange.Value
    if denominator == 0:
        cell = cellRange.TopLeft
        cell.BackColor = Color.Red
        cell.Offset(1, 0).Value = 'Tried to divide by zero'
        return 0
    return numerator / denominator

여분의 주름이 있습니다 : 전달 된 세포를 얻는 기능은 세포 값을 통과하기 때문에 분모를위한 1- 세포 셀 레인지를 통과해야한다고 주장합니다.

Excel에 맞지 않는 스프레드 시트로 특이한 일을하려고하거나 Python의 힘을 사용하여 스프레드 시트 데이터를 사용하는 데 관심이 있다면 Resolver를 살펴볼 가치가 있습니다.

다음은 쉬운 VBA 해결 방법이 있습니다. 이 예에서는 새로운 Excel 통합 문서를 열고 다음 코드를 코드 영역에 복사하십시오. Sheet1 (아니다 ThisWorkbook 또는 VBA Module). 그런 다음 들어갑니다 Sheet1 워크 시트의 왼쪽 상단 셀 중 하나에 무언가를 넣습니다. 숫자를 입력하고 Enter를 누르면 오른쪽의 셀이 숫자의 4 배로 업데이트되고 셀 배경은 밝은 파란색이됩니다. 다른 값은 다음 셀을 지우게합니다. 코드는 다음과 같습니다.

Dim busy As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
  If busy Then Exit Sub
  busy = True
  If Target.Row <= 10 And Target.Column <= 10 Then
    With Target.Offset(0, 1)
      If IsNumeric(Target) Then
        .Value = Target * 4
        .Interior.Color = RGB(212, 212, 255)
      Else
        .Value = Empty
        .Interior.ColorIndex = xlColorIndexNone
      End If
    End With
  End If
  busy = False
End Sub

서브 루틴은 시트의 모든 세포 변화 이벤트를 포착합니다. 행과 열이 둘 다 <= 10 인 경우 값이 숫자 인 경우 오른쪽의 셀이 변경된 셀의 4 배로 설정됩니다. 그렇지 않으면 오른쪽 셀이 지워집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top